某算法的板子练习(四)

堆优化dijkstra,在这个SPFA各种被卡的时代相当好用

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;

inline int read()
{
    int f=1,x=0;
    char ch=getchar();
    while(ch<'0' || ch>'9') {if(ch=='-') f=-1; ch=getchar();}
    while(ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}

struct node
{
    int nx,dis;
    bool operator < (const node a) const
    {
        return a.dis<dis;
    }
}f[100005];

priority_queue <node> q;

int n,m,s;
int cnt; 
int head[100005],nxt[200005],v[200005],w[200005];
bool book[100005];
int i,j; 

void add(int x,int y,int z)
{
    v[++cnt]=y;
    w[cnt]=z;
    nxt[cnt]=head[x];
    head[x]=cnt;
}

int main()
{
    n=read(); m=read(); s=read();
    int x,y,z;
    for(i=1;i<=m;i++)
    {
        x=read(); y=read(); z=read();
        add(x,y,z);
    }
    for(i=1;i<=n;i++) f[i].dis=0x7fffffff/2,f[i].nx=i;
    f[s].dis=0;
    q.push(f[s]);
    while(!q.empty())
    {
        x=q.top().nx; 
        q.pop();
        if(book[x]) continue;
        book[x]=1;
        for(i=head[x];i;i=nxt[i])
        {
            y=v[i];
            if(f[y].dis>f[x].dis+w[i])
            {
                f[y].dis=f[x].dis+w[i];
                if(!book[y]) q.push(f[y]);//这两句一定不能写反 
            }
        }
    }
    bool flag=0;
    for(i=1;i<=n;i++)
    {
        if(flag) printf(" ");
        printf("%d",f[i].dis);
        flag=1;
    }
    return 0;
}

~NOIP2018 加油~

猜你喜欢

转载自www.cnblogs.com/llllllpppppp/p/9937339.html
今日推荐