Dijkstra(迪杰斯特拉求最短路径)-02-有向图-网络延迟时间

有 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。

 1 class Solution {
 2 public:
 3     int networkDelayTime(vector<vector<int>>& times, int N, int K) {
 4         vector<vector<int>>G(N,vector<int>(N,1000));
 5         vector<int>dist(N,1000);
 6         for(int i = 0;i<times.size();i++){
 7             G[times[i][0]-1][times[i][1]-1] = times[i][2];
 8         }
 9         //////////////////////////////////////////////////////////////
10         for(int i = 0;i<N;i++){
11             dist[i] = G[K-1][i];
12         }
13         //////////////////////////////////////////////////////////////
14         vector<int>s(N,0); 
15         s[K - 1] = 1;
16         dist[K - 1] = 0; 
17         int num = 1;
18         int max = 0;
19         while(num < N){
20             int min = 1000;
21             int next = -1;
22             for(int i = 0;i<N;i++){
23                 if(s[i] == 0&&dist[i] < min){
24                     min = dist[i];
25                     next = i;
26                 }
27             }
28             if(min == 1000)
29                 return -1;
30             s[next] = 1;
31             num++;
32             for(int i = 0;i<N;i++){
33                 if(dist[i] > dist[next]+G[next][i]&&G[next][i] != 1000){ 
34                     dist[i] = dist[next] +G[next][i]; 
35                 }
36             }
37         }
38         for(int i = 0;i < N;i++){
39             if(max < dist[i])
40                 max = dist[i];
41         }
42         return max;
43     }
44 };
posted @ 2019-12-15 16:07  我只是一个码农  阅读(443)  评论(0编辑  收藏  举报