743. 网络延迟时间 (最短距离)

题目出处:https://leetcode-cn.com/problems/network-delay-time/

743. 网络延迟时间 (最短距离)

思路:用最短距离算法计算出从节点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;  
    }
};

上一篇:网络流24题(一)


下一篇:那年那些最短路水题