28. Find the City With the Smallest Number of Neighbors at a Threshold Distance
There are n
cities numbered from 0
to n-1
. Given the array edges
where edges[i] = [fromi, toi, weighti]
represents a bidirectional and weighted edge between cities fromi
and toi
, and given the integer distanceThreshold
.
Return the city with the smallest number of cities that are reachable through some path and whose distance is at most distanceThreshold
, If there are multiple such cities, return the city with the greatest number.
Notice that the distance of a path connecting cities i and j is equal to the sum of the edges' weights along that path.
Example 1:
Input: n = 4, edges = [[0,1,3],[1,2,1],[1,3,4],[2,3,1]], distanceThreshold = 4
Output: 3
Explanation: The figure above describes the graph.
The neighboring cities at a distanceThreshold = 4 for each city are:
City 0 -> [City 1, City 2]
City 1 -> [City 0, City 2, City 3]
City 2 -> [City 0, City 1, City 3]
City 3 -> [City 1, City 2]
Cities 0 and 3 have 2 neighboring cities at a distanceThreshold = 4, but we have to return city 3 since it has the greatest number.
Example 2:
Input: n = 5, edges = [[0,1,2],[0,4,8],[1,2,3],[1,4,2],[2,3,1],[3,4,1]], distanceThreshold = 2
Output: 0
Explanation: The figure above describes the graph.
The neighboring cities at a distanceThreshold = 2 for each city are:
City 0 -> [City 1]
City 1 -> [City 0, City 4]
City 2 -> [City 3, City 4]
City 3 -> [City 2, City 4]
City 4 -> [City 1, City 2, City 3]
The city 0 has 1 neighboring city at a distanceThreshold = 2.
Solution: (Dijkstra’s Algorithm on all source nodes)
class Solution
{
public:
int res = INT_MAX;
int prevCount = INT_MAX;
void findSortestPath(int src, vector<pair<int, int>> v[], int n, int threshold)
{
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
vector<int> dist(n, INT_MAX);
vector<bool> vs(n, false);
dist[src] = 0;
pq.push({0, src});
while (!pq.empty())
{
int weight = pq.top().first;
int node = pq.top().second;
pq.pop();
if (vs[node])
{
continue;
}
vs[node] = 1;
for (int i = 0; i < v[node].size(); i++)
{
int cn = v[node][i].first;
int cw = v[node][i].second;
if (cw + weight < dist[cn])
{
dist[cn] = cw + weight;
pq.push({dist[cn], cn});
}
}
}
int count = 0;
for (int i = 0; i < n; i++)
{
if (i == src)
{
continue;
}
if (dist[i] <= threshold)
{
count++;
}
}
if (count <= prevCount)
{
prevCount = count;
res = src;
}
return;
}
int findTheCity(int n, vector<vector<int>> &edges, int distanceThreshold)
{
vector<pair<int, int>> v[n];
for (int i = 0; i < edges.size(); i++)
{
int a = edges[i][0];
int b = edges[i][1];
int w = edges[i][2];
v[a].push_back({b, w});
v[b].push_back({a, w});
}
for (int i = 0; i < n; i++)
{
findSortestPath(i, v, n, distanceThreshold);
}
return res;
}
};
Solution: (Floyd Warshall)
class Solution
{
public:
void findSortestPath(vector<vector<int>> &v, int n)
{
for (int k = 0; k < n; k++)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
v[i][j] = min(v[i][j], v[i][k] + v[k][j]);
}
}
}
}
int findTheCity(int n, vector<vector<int>> &edges, int distanceThreshold)
{
vector<vector<int>> v(n, vector<int>(n, 100000));
for (int i = 0; i < n; i++)
{
v[i][i] = 0;
}
for (int i = 0; i < edges.size(); i++)
{
int a = edges[i][0];
int b = edges[i][1];
int w = edges[i][2];
v[a][b] = w;
v[b][a] = w;
}
findSortestPath(v, n);
int prevCount = INT_MAX;
int res = -1;
for (int i = 0; i < n; i++)
{
int count = 0;
for (int j = 0; j < n; j++)
{
if (v[i][j] <= distanceThreshold)
{
count++;
}
}
if (count <= prevCount)
{
prevCount = count;
res = i;
}
}
return res;
}
};
Last updated
Was this helpful?