笔记 LeetCode743.网络延迟时间

有 n 个网络节点,标记为 1 到 n。

 给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。

现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1 。

示例 1:

特征1.有向图

特征2.最短距离最大值(将时间等价于距离)

特征3.单源遍历有向图算法 (最短路径) 

  • Floyd、DisjKstra、SPFA算法

借鉴后,用迪杰斯特拉算法: 

class Solution {
public:
    int networkDelayTime(vector<vector<int>>& times, int n, int k) {
        //通过输入的times多维数组构造邻接矩阵
        vector<vector<int>> graph(n+1,vector<int>(n+1,-1));
        for(auto &time:times){
            graph[time[0]][time[1]]=time[2];
        }
        //用dis来存储最短距离
        vector<int> dis(n+1,INT_MAX);
        //创建队列
        queue<int> Q;
        //先将源点放入队列中,源点到源点的距离设置为0
        Q.push(k);
        dis[k] = 0;
        //while循环,当队列中没有元素跳出
        while(!Q.empty()){
            int top = Q.front();
            Q.pop();
            for(int i=1;i<=n;i++){
                //遍历所有点,从队首元素出发,如果存在路径,判断是否为最小值,如果是则修改dis数组元素
                if(graph[top][i]!=-1&&graph[top][i]+dis[top]<dis[i]){
                    dis[i]=graph[top][i]+dis[top];
                    Q.push(i);//将下一个点放入队列,作为下次循环的起点
                }
            }
        }
        //当队列中元素遍历完,最短距离数组dis已经完整。这时遍历数组取出最大值
        int max = 0;
        for(int i=1;i<=n;i++){
            if(max<dis[i]){
                max = dis[i];
            }
        }
        return max == INT_MAX?-1:max;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值