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

2022/5/3 9:14:39

本文主要是介绍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 };


这篇关于743. 网络延迟时间(dijkstral算法)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程