zoukankan      html  css  js  c++  java
  • [模板]Dijkstra-优先队列优化-单源最短路

    输入:

    6 9 1
    1 2 1
    1 3 12
    2 3 9
    2 4 3
    3 5 5
    4 3 4
    4 5 13
    4 6 15
    5 6 4

    输出:

    0 1 8 4 13 17

    Code:

    
    #include<iostream>
    #include<cstring>
    #include<queue>
    using namespace std;
    #define PII pair<int,int>
    const int maxn=10000,maxm=1000;
    int cnt=0,edge[maxm],ver[maxm],nxt[maxm],head[maxn];
    int d[maxn];
    bool v[maxn];//v[i]表示i点是否松弛 
    priority_queue < PII,vector<PII>,greater<PII> > q;//优先队列,以p.first最小优先
    inline void add(int x,int y,int z)
    {
        cnt++;
        ver[cnt]=y;
        edge[cnt]=z;
        nxt[cnt]=head[x];
        head[x]=cnt;
    }
    inline void dijk(int t)
    {
        int i;
        memset(d,0x3f,sizeof(d));
        memset(v,0,sizeof(v));
        d[t]=0;
        for(i=head[t];i;i=nxt[i])
            d[ver[i]]=edge[i];//d[i]为t->i当前的最小值 
        
        q.push(make_pair(0,t));
        while(!q.empty())
        {
            int mind=q.top().second;//mind为距离t距离最小的点
            q.pop();
            if(v[mind]==1)//已松弛过 
                continue;
            for(i=head[mind];i;i=nxt[i])
            {
                if(d[mind]+edge[i]<d[ver[i]])//(t->mind)-->ver[i]距离取更小d[ver[i]]
                    d[ver[i]]=d[mind]+edge[i];
                q.push( make_pair(d[ver[i]],ver[i]) );
            }
            v[mind]=1;
        }
    }
    int main()
    {
        int n,m,i,t;
        cin>>n>>m>>t;
        for(i=0;i<m;i++)
        {
            int a,b,c;
            cin>>a>>b>>c;
            add(a,b,c);
        }
        dijk(t);
        for(i=1;i<n;i++)
            cout<<d[i]<<" ";
        cout<<d[n];//格式 
        return 0;
    }
    
  • 相关阅读:
    js设计模式——代理模式
    js设计模式——策略模式
    js设计模式——单例模式
    Krpano vtourskin.xml 默认皮肤详解
    通过JS动态切换大场景xml
    krpano 户型地图雷达
    微信小程序开发
    CSS3的calc()使用
    Yslow
    微信分享
  • 原文地址:https://www.cnblogs.com/xyz0815/p/11873972.html
Copyright © 2011-2022 走看看