有 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 };