题目地址:
给定 n n n个顶点的无向非负权图,顶点编号 0 ∼ n − 1 0\sim n-1 0∼n−1。给定一个正的阈值 t t t,问所有点中能走不超过 t t t的距离到达的点最少的那个点的编号。如果多个点满足要求,则返回编号最大的那个。
可以用多点对最短路的Floyd算法先求出两两的最短路长度,参考https://blog.csdn.net/qq_46105170/article/details/113821689,然后直接暴力枚举每个点即可。代码如下:
class Solution {
public:
int findTheCity(int n, vector<vector<int>>& edges, int dt) {
int d[n][n];
memset(d, 0x3f, sizeof d);
for (auto& e : edges) {
int x = e[0], y = e[1];
d[x][y] = d[y][x] = min(d[x][y], e[2]);
}
for (int k = 0; k < n; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
d[i][j] = i == j ? 0 : min(d[i][j], d[i][k] + d[k][j]);
int res = n, max_cnt = n;
for (int i = 0; i < n; i++) {
int cnt = 0;
for (int j = 0; j < n; j++) {
if (j == i) continue;
if (d[i][j] <= dt) cnt++;
}
if (cnt <= max_cnt) {
res = i;
max_cnt = cnt;
}
}
return res;
}
};
时间复杂度 O ( n 3 ) O(n^3) O(n3),空间 O ( n 2 ) O(n^2) O(n2)。