743. 网络延迟时间(dijkstral算法)

743. 网络延迟时间

有 n 个网络节点,标记为 1 到 n

给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。

现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1 。

 

示例 1:

输入:times = [[2,1,1],[2,3,1],[3,4,1]], n = 4, k = 2 输出:2 

示例 2:

输入:times = [[1,2,1]], n = 2, k = 1 输出:1 

示例 3:

输入:times = [[1,2,1]], n = 2, k = 2 输出:-1 

 

提示:

  • 1 <= k <= n <= 100
  • 1 <= times.length <= 6000
  • times[i].length == 3
  • 1 <= ui, vi <= n
  • ui != vi
  • 0 <= wi <= 100
  • 所有 (ui, vi) 对都 互不相同(即,不含重复边)
 1 class Solution {  2 public:  3     static constexpr int INF = 0x3F3F3F3F;  4     vector<int> dijkstral(const vector<vector<int>> &graph, int start) {  5         int n = graph.size();  6         vector<int> dis(n, INF); // 初始化起点到各节点最短距离为无穷大  7         vector<bool> visited(n, false); // 初始化所有节点未被选过  8         dis[start] = 0; // 初始起点到起点距离为0  9         for (int i = 0; i < n - 1; i++) { 10             int minNode = -1; 11             // 选定一个节点: 12             // 1)未被选过; 13             // 2)距离最短; 14             for (int j = 0; j < n; j++) { 15                 if (!visited[j] && ((minNode == -1) || (dis[j] < dis[minNode]))) { 16                     minNode = j; 17                 } 18             } 19             // 对于已选择的节点作为中转站,刷新经过中转站到各节点的最短路径 20             for (int j = 0; j < n; j++) { 21                 dis[j] = std::min(dis[j], dis[minNode] + graph[minNode][j]); 22             } 23             visited[minNode] = true; 24         } 25         return dis; 26     } 27     int networkDelayTime(vector<vector<int>>& times, int n, int k) { 28         vector<vector<int>> graph(n, vector<int>(n, INF)); 29         for (auto &vec : times) {             30             graph[vec[0] - 1][vec[1] - 1] = vec[2]; 31         } 32         vector<int> dis(n, INF); 33         vector<bool> visited(n, false); 34         dis[k - 1] = 0; 35         vector<int> ans; 36         ans = dijkstral(graph, k - 1); 37         sort(ans.begin(), ans.end()); 38         int size = ans.size(); 39         return (ans[size - 1] == INF) ? -1 : ans[size - 1]; 40     } 41 };