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

匿名 (未验证) 提交于 2019-12-02 23:32:01
版权声明:本文为博主原创文章,博客地址:https://blog.csdn.net/qq_41855420,未经博主允许不得转载。 https://blog.csdn.net/qq_41855420/article/details/89786066

问题描述:

有 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;     } };  

文章来源: https://blog.csdn.net/qq_41855420/article/details/89786066
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!