版权声明:本文为博主原创文章,博客地址: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