[模板]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;
}
原文地址:https://www.cnblogs.com/xyz0815/p/11873972.html