【模板】SPFA

单源最短路径算法,可判负环(如果一个点进队超过N次,则存在负环)

 1 #include<stdio.h>
 2 #define maxv 10005
 3 #define maxe 500005
 4 #define inf 210000000
 5 int vert,edg,tot,s,fr[maxv],to[maxe],nxt[maxe],w[maxe],que[maxe],dist[maxv];
 6 bool inq[maxv];
 7 void adde(int p,int q,int W)
 8 {to[++tot]=q;w[tot]=W;nxt[tot]=fr[p];fr[p]=tot;}
 9 void spfa();
10 int main()
11 {
12     scanf("%d%d%d",&vert,&edg,&s);
13     int i,p,q,W;
14     for(i=1;i<=edg;i++)
15         scanf("%d%d%d",&p,&q,&W),adde(p,q,W);
16     spfa();
17     for(i=1;i<=vert;i++) printf("%d ",dist[i]);
18     return 0;
19 }
20 void spfa()
21 {
22     int l=0,r=0,i,now,t;
23     for(i=1;i<=vert;i++) dist[i] = inf;
24     dist[s] = 0;que[++r] = s; inq[s] = true;
25     while(l<r)
26     {
27         now = que[++l];
28         inq[now] = false;
29         for(i=fr[now];i;i=nxt[i])
30         {
31             t = to[i];
32             if(dist[t]>dist[now]+w[i])
33             {
34                 dist[t] = dist[now]+w[i];
35                 if(!inq[t]){que[++r]=t;inq[t]=true;}
36             }
37         }
38     } 
39 }
View Code

 

posted @ 2017-04-14 13:12  h_zs  阅读(128)  评论(0编辑  收藏  举报