743. 网络延迟时间

79 阅读1分钟

链接:leetcode.cn/problems/ne…

思路

迪杰斯特拉模板题

每次在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;
        }
    }
};