思路
迪杰斯特拉模板题
每次在dis中找最小值,更新它的邻居的dis,直到所有节点都done或者有节点不可达。
代码实现
class Solution {
public:
int networkDelayTime(vector<vector<int>>& times, int n, int k) {
vector<vector<int>>g(n,vector<int>(n,INT_MAX/2));
for(auto t:times){
g[t[0]-1][t[1]-1]=t[2];
}
//dis数组为从节点k到其他节点的最小值,如果结果dis为无穷大则说明不可达
vector<int>dis(n,INT_MAX/2),done(n);
//初始节点的dis为0
dis[k-1]=0;
while(1){
int x=-1;
for(int i=0;i<n;i++){
//找除了已完成节点的dis[i]最小值
if(!done[i]&&(x<0||dis[i]<dis[x])){
x=i;
}
}
//全部节点都找完了,返回dis的最大值
if(x<0){
return ranges::max(dis);
}
//最小值是INT_MAX/2,说明不可到达
if(dis[x]==INT_MAX/2){
return -1;
}
//更新值
for(int i=0;i<n;i++){
dis[i]=min(dis[i],dis[x]+g[x][i]);
}
//标记为已完成节点
done[x]=true;
}
}
};