• leetcode743


    Dijkstra算法

    https://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html

    dijkstra Bellman_Ford与Floyd算法的性质比较与实现

    https://blog.csdn.net/jxlincong/article/details/44887111

    Bellman_Ford

    https://www.codenong.com/cs106059004/

    三种算法题解

    https://www.cnblogs.com/grandyang/p/8278115.html

     为什么std :: multimap比std :: priority_queue慢

    https://www.codenong.com/41807720/

    算法 - 优先队列 - 斐波那契堆

    https://redspider110.github.io/2018/09/25/0105-algorithms-fibonacci-heap/

    https://www.cnblogs.com/skywang12345/p/3659060.html

    https://stackoverflow.com/questions/504823/has-anyone-actually-implemented-a-fibonacci-heap-efficiently

    https://www.cnblogs.com/frankcui/p/12088422.html

    https://www.cs.au.dk/~gerth/papers/stoc12.pdf

    https://www.cs.au.dk/~gerth/papers/soda96.pdf

    1.dijkstra实现

    class Solution {
    public:
        int networkDelayTime(vector<vector<int>>& times, int n, int k) {
            unordered_map<int,multimap<int,int>> graph=buildGraph(times);
            vector<int> distance(n + 1, INT_MAX);
            distance[k]=0;
            int que=k;
            int cnt=0;//count the node
            bool noted[n+1];
            memset(noted,0,(n+1)*sizeof(bool));
            noted[k]=true;
            multimap<int,int> min_que;//剩余未遍历点的路径最短的优先队列
            while(que!=-1){
                //cout<<1<<endl;
                int tmp=que;
                que=-1;
                ++cnt;
                if(graph.count(tmp)){
                    //cout<<2<<endl;
                    multimap<int,int> & edges=graph.at(tmp);
                    for (auto edge = edges.begin(); edge != edges.end(); ++edge) {
                        //cout<<3<<endl;
                        if(distance[edge->second]>distance[tmp]+edge->first){
                            min_que.emplace(distance[tmp]+edge->first,edge->second);
                        }
                        distance[edge->second]=min(distance[edge->second],distance[tmp]+edge->first);
                    }
                }
                while(!min_que.empty()){
                    auto cost=min_que.begin();
                    if(!noted[cost->second]){
                        que=cost->second;
                        noted[cost->second]=1;
                        min_que.erase(min_que.begin());
                        break;
                    }
                    min_que.erase(min_que.begin());
                }
            }
            if(cnt!=n){
                return -1;
            }
            int ret=0;
            for(int i=1;i<=n;++i){
                //cout<<distance[i]<<endl;
                ret=max(distance[i],ret);
            }
            return ret;
        }
        private:
        template <typename T>
        unordered_map<T,multimap<T,int>> buildGraph(vector<vector<T>>& times) {
            unordered_map<T,multimap<T,int>> g;
            for(auto a:times){
                g[a[0]].insert(pair <int, int> (a[2],a[1]));
                //g[a[0]].emplace(a[1],a[2]);
            }
            return g;
        }
    };

     改用优先队列

    struct node
    {
        int x, y;
        node(int x,int y):x(x),y(y){}
    };
     
    struct cmp
    {
        bool operator()(node a,node b)
        {
            if(a.x == b.x)  return a.y >= b.y;
            else return a.x > b.x;
        }
    };
    class Solution {
    public:
        int networkDelayTime(vector<vector<int>>& times, int n, int k) {
            unordered_map<int,multimap<int,int>> graph=buildGraph(times);
            vector<int> distance(n + 1, INT_MAX);
            distance[k]=0;
            int que=k;
            int cnt=0;//count the node
            bool noted[n+1];
            memset(noted,0,(n+1)*sizeof(bool));
            noted[k]=true;
            //multimap<int,int> min_que;//剩余未遍历点的路径最短的优先队列
            priority_queue<node,vector<node>,cmp> min_que;
            while(que!=-1){
                //cout<<1<<endl;
                int tmp=que;
                que=-1;
                ++cnt;
                if(cnt>n){
                    return -1;
                }
                if(graph.count(tmp)){
                    //cout<<2<<endl;
                    multimap<int,int> & edges=graph.at(tmp);
                    for (auto edge = edges.begin(); edge != edges.end(); ++edge) {
                        //cout<<3<<endl;
                        if(distance[edge->second]>distance[tmp]+edge->first){
                            //min_que.emplace(distance[tmp]+edge->first,edge->second);
                            min_que.emplace(node(distance[tmp]+edge->first,edge->second));
                        }
                        distance[edge->second]=min(distance[edge->second],distance[tmp]+edge->first);
                    }
                }
                while(!min_que.empty()){
                    //auto cost=min_que.begin();
                    //if(!noted[cost->second]){
                    //    que=cost->second;
                    //    noted[cost->second]=1;
                    //    min_que.erase(min_que.begin());
                    //    break;
                    //}
                    //min_que.erase(min_que.begin());
                    auto cost=min_que.top();
                    if(!noted[cost.y]){
                        //cout<<cost.x<<":"<<cost.y<<endl;
                        que=cost.y;
                        noted[cost.y]=1;
                        min_que.pop();
                        break;
                    }
                    min_que.pop();
                }
            }
            if(cnt!=n){
                return -1;
            }
            int ret=0;
            for(int i=1;i<=n;++i){
                //cout<<distance[i]<<endl;
                ret=max(distance[i],ret);
            }
            return ret;
        }
        private:
        template <typename T>
        unordered_map<T,multimap<T,int>> buildGraph(vector<vector<T>>& times) {
            unordered_map<T,multimap<T,int>> g;
            for(auto a:times){
                g[a[0]].insert(pair <int, int> (a[2],a[1]));
                //g[a[0]].emplace(a[1],a[2]);
            }
            return g;
        }
    };
  • 相关阅读:
    jQuery 1.6 正式版发布
    EXT.NET Toolbar GridPanel自动宽度和高度的解决方案,引入Viewport
    sql server 2005 数据库状态 变成 可疑的解决方案
    将远程图片读取到本地,并保存
    ^M 替换 VI
    php ctags
    闲来无聊,想了下秒杀、抢购实现方法
    mysql 'OR','IN',‘union’效率分析
    js 全选
    yii rule
  • 原文地址:https://www.cnblogs.com/Babylon/p/14654471.html
Copyright © 2020-2023  润新知