n次Dijkstra
class Solution {
public:
int n;
void dijkstra(int s,vector<vector<int>> &graph,vector<int> &d){
vector<bool> vis(n,0);
d[s] = 0;
for(int i=0;i<n;i++){
int y = -1;
for(int j=0;j<n;j++){
if(!vis[j] && ( y==-1 || d[j]<d[y] )){
y = j;
}
}
vis[y] = 1;
for(int x=0;x<n;x++){
if(d[x]>d[y]+graph[x][y]){
d[x] = d[y] + graph[x][y];
}
}
}
}
int findTheCity(int n, vector<vector<int>>& edges, int distanceThreshold) {
this->n = n;
vector<int> res(n,0);
int minNum = n,minID=0;
vector<vector<int>> graph(n+1,vector<int>(n+1,(int)5e8));
for(auto &edge:edges){
graph[edge[0]][edge[1]] = edge[2];
graph[edge[1]][edge[0]] = edge[2];
}
for(int i=0;i<n;i++){
vector<int> d(n,(int)5e8);
dijkstra(i,graph,d);
for(int x:d){
// cout<<x<<" ";
if(x<=distanceThreshold){
res[i]++;
}
}
res[i]--;
// cout<<" -- "<<res[i]<<endl;
minNum = min(minNum,res[i]);
}
for(int i=0;i<n;i++){
if(res[i]==minNum){
minID = i;
}
}
return minID;
}
};
一次FLoyd求任意兩點的距離
class Solution {
public:
int findTheCity(int n, vector<vector<int>>& edges, int distanceThreshold) {
int d[110][110];
memset(d,0x3f,sizeof(d));
for(int i=0;i<n;i++) d[i][i] = 0; //自己到自己的距離爲0
for(auto &e:edges){
d[e[0]][e[1]] = d[e[1]][e[0]] = 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] = min(d[i][j],d[i][k]+d[k][j]);
int res[110] = {0},minNum = n,minID;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(d[i][j]<=distanceThreshold){
res[i]++;
}
}
minNum = min(minNum,res[i]);
}
for(int i=0;i<n;i++){
if(res[i]==minNum){
minID = i;
}
}
return minID;
}
};