SPFA模板

/*  SPFA求单源最短路径长度 
	时间复杂度O(KE) 
*/
#include <bits/stdc++.h> 
using namespace std;  
const int maxn=300001;  
const int inf =0x7ffffff;  
struct edge  
{  
    int from,to,w,next;  
}e[1000001];  
int head[maxn];  
int vis[maxn];  
int dist[maxn];  
int n,m,t;  
void add(int i,int j,int w)  
{  
    e[t].from=i;  
    e[t].to=j;  
    e[t].w=w;  
    e[t].next=head[i];  
    head[i]=t++;  
}  
void spfa(int s)  
{  
    queue <int> q;  
    for(int i=1;i<=n;i++)  
    dist[i]=inf;  
    memset(vis,false,sizeof(vis));  
    q.push(s);  
    dist[s]=0;  
    while(!q.empty())  
    {  
        int u=q.front();  
        q.pop();  
        vis[u]=false;  
        for(int i=head[u];i!=-1;i=e[i].next)  
        {  
            int v=e[i].to;  
            if(dist[v]>dist[u]+e[i].w)  
            {  
                dist[v]=dist[u]+e[i].w;  
                if(!vis[v])  
                {  
                    vis[v]=true;  
                    q.push(v);  
                }  
            }  
        }  
    }  
}  
int main()  
{  
    int a,b,c,s,e;  
    scanf("%d%d",&n,&m);  
    t=0;  
    memset(head,-1,sizeof(head));  
    while(m--)  
    {  
        scanf("%d%d%d",&a,&b,&c);  
        add(a,b,c);  
    }  
   // scanf("%d%d",&s,&e);  
    spfa(1);  
    //if(dist[e]==inf) printf("-1\n");  
    for (int i = 2; i<=n; i++)
		printf("%d\n",dist[i]);  
    return 0;  
}  

posted @ 2016-11-04 17:40  Tovi  阅读(189)  评论(0编辑  收藏  举报