Dijkstra 迪杰斯特拉 最短路径问题
解题思路
Dijkstra 迪杰斯特拉
描述的是特定点到所有节点的最短距离 dst
每次找出距离 本阶段最近的节点 can_node
遍历can_node 的子节 更新 距离列表
代码
class Solution {
public:
int networkDelayTime(vector<vector<int>>& times, int n, int k) {
//Dijkstra 迪杰斯特拉
// 描述的是特定点到所有节点的最短距离 dst
// 每次找出距离 本阶段最近的节点 can_node
// 遍历can_node 的子节 更新 距离列表
// 1. 边图转邻接表
std::unordered_map<int, std::unordered_map<int,int> > graph;
for(const auto & t: times )
{
graph[t[0]].emplace(t[1],t[2]);
}
// 2.while
std::vector<int> dist(n+1,INT_MAX);
dist[k] = 0;
std::vector<int> visited(n+1,0);
while(1)
{
//canval , argcan= min(dist)
int canNode= -1;
int canDist = INT_MAX;
for(int i=1;i<=n;i++)
{
if(visited[i]==0 && dist[i]<canDist)
{
canNode= i;
canDist = dist[i];
}
}
// std::cout << canNode << std::endl;
if(-1== canNode ) break;
visited[canNode] =1;
// if not find argcan break;
//update children
// for child in argcan.children:
// dist[child]= min( dist[child] , dist[can_node] + val)
for(const auto & child : graph[canNode])
{
if( dist[child.first] > dist[canNode] + child.second ) dist[child.first] = dist[canNode] + child.second;
}
}
// for(auto x: dist) std::cout << x << " ";
// std::cout << std::endl;
int tmp= *std::max_element(dist.begin()+1,dist.end() );
if(tmp==INT_MAX ) return -1;
else return tmp;
}
};
题目描述
有 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) 对都 互不相同(即,不含重复边)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/network-delay-time
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。