题目出处:https://leetcode-cn.com/problems/network-delay-time/
思路:用最短距离算法计算出从节点k到途中其他节点的最短距离。找出其中的最大值即可。
dijstra算法:主要的思路是贪心。将所有的节点分为两类,一类是已确定节点,一类是未确定节点。每次从未确定节点中选取一个与起点距离最短的节点,将他归类为已确定节点,并用它来更新从起点到其他所有未确定节点的距离。直到所有的点都被归类为已确定节点。
typedef pair<int, int> pii;
class Solution {
private:
int ans = 0;
vector<unordered_map<int,int>> edge;
public:
int networkDelayTime(vector<vector<int>>& times, int n, int k) {
edge.resize(n);
for(auto & v : times){
edge[v[0]-1][v[1]-1] = v[2];
}
vector<int> dis(n, INT_MAX); dis[k-1] = 0;
priority_queue<pii, vector<pii>, greater<>> q; //默认按照first元素排序
q.push({0, k-1}); //{节点到k的距离, 节点}
while(!q.empty()){
int dis_q = q.top().first;
int num_q = q.top().second; //距离起点最近的点
q.pop();
if(dis_q > dis[num_q]){ //保证是未确定的且离起点距离最短的点
continue;
}
for(auto & v : edge[num_q]){ //用该点更新其他点的距离
if(dis[v.first] > dis[num_q] + edge[num_q][v.first]){
dis[v.first] = dis[num_q] + edge[num_q][v.first];
q.push({dis[v.first], v.first});
}
}
}
ans = *max_element(dis.begin(), dis.end());
return ans == INT_MAX ? -1 : ans;
}
};