Find the City With the Smallest Number of Neighbors at a Threshold Distance
MediumDynamic ProgrammingGraphShortest Path
Solution
export function findTheCity(n: number, edges: number[][], distanceThreshold: number): number {
const distance = floydWarshall(n, edges);
let answer = 0;
let minReachableCities = Number.MAX_SAFE_INTEGER;
for (let city = 0; city < n; city++) {
const reachableCities = getReachableCities(distance, distanceThreshold, city);
if (reachableCities <= minReachableCities) {
answer = city;
minReachableCities = reachableCities;
}
}
return answer;
}
function floydWarshall(n: number, edges: number[][]): number[][] {
const distance = Array.from({ length: n }, (_, i) =>
Array.from({ length: n }, (_, j) => (i === j ? 0 : Number.MAX_SAFE_INTEGER)),
);
for (const [from, to, weight] of edges) {
distance[from][to] = weight;
distance[to][from] = weight;
}
for (let k = 0; k < n; k++) {
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
distance[i][j] = Math.min(distance[i][j], distance[i][k] + distance[k][j]);
}
}
}
return distance;
}
function getReachableCities(distance: number[][], distanceThreshold: number, city: number) {
let reachableCities = 0;
for (let dest = 0; dest < distance.length; dest++) {
if (distance[city][dest] <= distanceThreshold) {
reachableCities += 1;
}
}
return reachableCities;
}
Complexity
- Time:
O(N^3)
- Space:
O(N^2)