有 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
且1 <= w <= 100
。
思路
1、用Dijkstra做
code
class Solution {
public:
int networkDelayTime(vector<vector<int>>& times, int N, int K) {
vector<int> dist(N+1,INT_MAX); //距离数组
vector<vector<int>> edges(101,vector<int>(101,-1)); //图的保存
dist[K]=0; //从k开始,初始化k
int res=INT_MIN;
queue<int> q{{K}};
for(auto edge:times)
edges[edge[0]][edge[1]]=edge[2];
while(!q.empty()){
unordered_set<int> visited;
for (int i = q.size(); i > 0; --i) //可能q为空,但还有节点未被扫到,所以加循环
{
int u = q.front(); q.pop();
for (int v = 1; v <= 100; ++v) //i节点与每个v节点的关系
if (edges[u][v] != -1 && dist[u] + edges[u][v] < dist[v])
{
if (!visited.count(v)) {
visited.insert(v);
q.push(v);
}
dist[v] = dist[u] + edges[u][v];
}
}
}
for (int i = 1; i <= N; ++i)
res = max(res, dist[i]);
return res==INT_MAX?-1:res;
}
};