LeetCode 网络延迟时间(图的最短路径问题)

问题描述:

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

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

现在,我们向当前的节点 K 发送了一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。

注意:

N 的范围在 [1, 100] 之间。
K 的范围在 [1, N] 之间。
times 的长度在 [1, 6000] 之间。
所有的边 times[i] = (u, v, w) 都有 1 <= u, v <= N 且 0 <= w <= 100。

思路分析:

首先我们应该明白,从k传输到所有的的时间 = max (从k到点1所需要的最少时间,从k到2所需要的最少时间 … 从k到n所需要的最少时间),因为传输的过程是同时的。所以这道题就转换为图的最短路径求解问题。
请翻阅 图的最短路径:Floyd、DisjKstra、SPFA算法

我们先使用DisjKstra算法求出各个点到k的最短距离,然后求出这些距离中最大值。

//DisjKstra算法
class Solution {
public:
    int networkDelayTime(vector<vector<int>>& times, int N, int K) {
        queue<int> myQue;//该队列用于即将访问的节点
        vector<int> distToK(N + 1, INT_MAX);//distToK[index]表示点K到点index的最短距离
        vector<vector<int>> graph(N+1,vector<int>(N+1,-1));//邻接矩阵
        for(auto &time:times){//构建邻接矩阵
            graph[time[0]][time[1]] = time[2];
        }
        myQue.push(K);
        distToK[K] = 0;//K到自己的最短距离为0
        //开始搜索各个点到k的最短距离
        while(!myQue.empty()){
            int front = myQue.front();
            myQue.pop();
            //利用当前front节点,尝试稀疏点k到所有节点的最短距离
            for(int target = 1; target <= N; ++target){
                if(graph[front][target] != -1 && distToK[front] + graph[front][target] < distToK[target]){
                    //如果front到target有边,并且点k到front的距离distToK[front] + 点front到target距离graph[front][target]小于点k到target的距离distToK[target]
                    distToK[target] = distToK[front] + graph[front][target];//则进行稀疏
                    myQue.push(target);//放入队列
                }
            }
        }
        //寻找点k到各个点的最短距离的最大值
        int maxRes = 0;
        for(int i = 1; i <= N; ++i){
            maxRes = max(maxRes, distToK[i]);
        }
        return maxRes == INT_MAX? -1 : maxRes;
    }
};

LeetCode 网络延迟时间(图的最短路径问题)_第1张图片

你可能感兴趣的:(LeetCode,图)