最短路SPFA_[模板]

题目:P3371【模板】单源最短路径

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=1000005,M=1000005;
const long long inf=2147483647;
int to[M],last[M],tep[N],ans[M];
int num[N],t[N];
int n,m,nn=0;   
int head,tail; 
bool vis[N];
void add(int a,int b,int c)
{
    nn++;
    to[nn]=b;
    ans[nn]=c;
    tep[nn]=last[a];
    last[a]=nn;
}                                                                
int main()
{
       int u,v,l;
       int s;
       scanf("%d%d%d",&n,&m,&s);
       for(int i=1;i<=m;i++)
       {
           scanf("%d%d%d",&u,&v,&l);
           add(u,v,l);
    }
    for(int i=0;i<=n;i++)
    {
     vis[i]=0;
     num[i]=inf;
    }     
    num[s]=0;
    head=1; tail=1;
    t[1]=s; vis[s]=1;
    int k;
    while (head<=tail)
    {
           k=last[t[head]];
           vis[t[head]]=0;
           for(int i=k;i!=0;i=tep[i])
           {
            if(num[t[head]]+ans[i]<num[to[i]])
            {
                num[to[i]]=num[t[head]]+ans[i];
                if (vis[to[i]]==0)
               {
                   vis[to[i]]=1;
                   tail++;
                   t[tail]=to[i];
            }
            }
       }
        head++;               
    } 
    for(int i=1;i<=n;i++)
     printf("%d ",num[i]);  
} 

 

posted @ 2020-11-04 19:31  Li_yxxx  阅读(41)  评论(0)    收藏  举报