第16题:网络延迟时间

解题思路:先写一个比较函数,用于得到最小值,用Dijkstra算法算出源点到所有点的最短路径,再取最长的那个返回即可

源代码:

struct MyStruct {

    int pos;

    int time;

    //  比较函数, 在优先队列里, 将较小的排在尾部, top()得到的就是队列里面最小值

    bool operator<(const MyStruct &a) const

    {

        return time > a.time;

    }

};

class Solution {

public:

    int networkDelayTime(vector<vector<int>>& times, int n, int k) {

 unordered_map<int, vector<pair<int, int>>> myMap;

        for (const auto &element : times) {

            myMap[element[0]].push_back({element[1], element[2]});

        }

        // 存储最后的结果

        vector<int> pos(n + 1, INT_MAX);

        // 位置0是特殊处理, k点time初始化为0

        pos[0] = 0;

        pos[k] = 0;

        priority_queue<MyStruct> myQueue;

        // 将起点能一步到达的位置存入优先队列

        for (auto i = 0; i < myMap[k].size(); ++i) {

            myQueue.push({myMap[k][i].first, myMap[k][i].second});

            pos[myMap[k][i].first] = myMap[k][i].second;

        }

        vector<int> visited(n + 1, 0); // 标记已经处理的点

        visited[0] = 1;

        visited[k] = 1;

        while (myQueue.empty() == false) {

            auto [first, second] = myQueue.top(); // 得到当前能到达的最近距离的点 first是此点 second是k点到此点的最短距离

            myQueue.pop();

            visited[first] = 1; // 标记已经处理此点

            for (auto i = 0; i < myMap[first].size(); ++i) {

                if (visited[myMap[first][i].first] == 1) {

                    continue; // 已经处理的点不再访问

                }

                // 将此点能到达的下一个节点存入优先队列

                myQueue.push({myMap[first][i].first, second + myMap[first][i].second});

                pos[myMap[first][i].first] = min(second + myMap[first][i].second, pos[myMap[first][i].first]); // 更新最短距离

            }

        }

        auto maxElement = *max_element(pos.begin(), pos.end());

        if (maxElement == INT_MAX) {

            return -1;

        }

        return maxElement;

    }

};

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值