zoukankan      html  css  js  c++  java
  • dijkstra模板(好像是斐波那契额堆优化,但我为什么看起来像优先队列优化,和spfa一样)

    /*
    Dijkstra的算法思想:
    在所有没有访问过的结点中选出dis(s,x)值最小的x
    对从x出发的所有边(x,y),更新
    dis(s,y)=min(dis(s,y),dis(s,x)+dis(x,y))
    */
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <vector>
    using namespace std;
    const int Ni = 10000;
    const int INF = 0x3f3f3f3f;
    
    struct node{
        int x,d;
        node(){}
        node(int a,int b){x=a;d=b;}
        bool operator < (const node & a) const
        {
            if(d==a.d) return x<a.x;
            else return d > a.d;
        }
    };
    
    vector<node> eg[Ni];
    int dis[Ni],n;
    
    void Dijkstra(int s)
    {
        int i;
        memset(dis,INF,sizeof(dis));
        dis[s]=0;
        //用优先队列优化
        priority_queue<node> q;
        q.push(node(s,dis[s]));
        while(!q.empty())
        {
            node x=q.top();
            q.pop();
            for(i=0;i<eg[x.x].size();i++)
            {
                node y=eg[x.x][i];
                if(dis[y.x]>x.d+y.d)
                {
                    dis[y.x]=x.d+y.d;
                    q.push(node(y.x,dis[y.x]));
                }
            }
        }
    }
    
    int main()
    {
        int a,b,d,m;
        while(scanf("%d%d",&n,&m),n+m)
        {
            for(int i=0;i<=n;i++)
                eg[i].clear();
            while(m--)
            {
                scanf("%d%d%d",&a,&b,&d);
                eg[a].push_back(node(b,d));
                eg[b].push_back(node(a,d));
            }
            Dijkstra(1);
            printf("%d
    ",dis[n]);
        }
        return 0;
    }
    /*
    6 6
    1 2 2
    3 2 4
    1 4 5
    2 5 2
    3 6 3
    5 6 3
    */
  • 相关阅读:
    linux运维学习
    2017年阿里巴巴三面经验
    Spring Boot:在Spring Boot中使用Mysql和JPA
    meshroom和alicevision在Ubuntu16上的安装过程
    ubuntu rm -rf ntfs 硬盘恢复
    python 脚本内部修改 LD_LIBRARY_PATH
    python uml 图
    tlmgr 相关
    ubuntu 安装 clangd 10.0.0
    zsh 快捷键
  • 原文地址:https://www.cnblogs.com/lalalatianlalu/p/7822645.html
Copyright © 2011-2022 走看看