SPFA

来源:互联网 发布:在java当中interface 编辑:程序博客网 时间:2024/06/02 17:19

自认为优美的SPFA

#include<iostream>#include<cstdio>#define maxm 500005#define maxn 10005#define INF 0x5fffffffusing namespace std;int n,m,s;struct Edge{    int next;    int to;    int w;}e[maxm] ;int q[maxm],h[maxn],ok[maxn],dis[maxn];int p;void add_edge(int from ,int to,int w){    e[++p].next=h[from];    e[p].to=to;    e[p].w=w;    h[from]=p;}int tail,head;void SPFA(){    for(int i=1;i<=n;i++)      dis[i]=INF;    dis[s]=0;    ok[s]=1;    q[tail++]=s;    while(head<tail)    {        int u=q[head++];        ok[u]=0;        for(int i=h[u];i;i=e[i].next)        {            int v=e[i].to;            if(dis[u]+e[i].w<dis[v])             {                dis[v]=dis[u]+e[i].w;                if(!ok[v])                {                    q[tail++]=v;                    ok[v]=1;                 }             }        }    }}int main(){    scanf("%d%d%d",&n,&m,&s);    for(int i=1;i<=m;i++)    {        int from,to,w;        scanf("%d%d%d",&from,&to,&w);        add_edge(from,to,w);    }    SPFA();    for(int i=1;i<=n;i++)    {        printf("%d ",dis[i]);    }     return 0;}
原创粉丝点击