There are N
network nodes, labelled 1
to N
.
Given times
, a list of travel times as directed edges times[i] = (u, v, w)
, where u
is the source node, v
is the target node, and w
is the time it takes for a signal to travel from source to target.
Now, we send a signal from a certain node K
. How long will it take for all nodes to receive the signal? If it is impossible, return -1
.
Note:
N
will be in the range[1, 100]
.K
will be in the range[1, N]
.- The length of
times
will be in the range[1, 6000]
. - All edges
times[i] = (u, v, w)
will have1 <= u, v <= N
and1 <= w <= 100
.
题解:有向图中求起点所有最短路径中最长的一条,直接用DIjkstra算法即可,本题刚开始需要理解清楚题意,不是求起点到所有节点的路径总和,因为信息是同时发送的所需时间取决于最长的路径。注意下标是从1开始所以用for-each不能用
class Solution {
public:
int networkDelayTime(vector<vector<int>>& times, int N, int K) {
vector<int> d(N+1,0);
vector<bool> vis(N+1,false);
const int oo = 1000;
vector<vector<int>> G(N+1,vector<int>(N+1,oo));
for(int i=0;i<times.size();i++){
int u=times[i][0],v=times[i][1],w=times[i][2];
G[u][v]=w;
}
Dijkstra(K,G,d,vis);
int ans=0;
for(int i=1;i<d.size();i++)
{
if(d[i]==oo)return -1;
ans=max(ans,d[i]);
}
return ans;
}
void Dijkstra(int s,vector<vector<int>> G,vector<int>& d,vector<bool> vis)
{
const int oo = 1000;
fill(d.begin(),d.end(),oo);
d[s]=0;
for(int i=1;i<G.size();i++)
{
int u=-1,MIN=oo;
for(int j=1;j<G.size();j++){
if(vis[j]==false&&d[j]<MIN){
u=j;
MIN=d[j];
}
}
if(u==-1)return;
vis[u]=true;
for(int v=1;v<G.size();v++){
if(vis[v]==false&&G[u][v]!=oo&&d[u]+G[u][v]<d[v]){
d[v]=d[u]+G[u][v];
}
}
}
}
};