问题描述:
有 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;
}
};
来源:CSDN
作者:hestyle
链接:https://blog.csdn.net/qq_41855420/article/details/89786066