单源最短路径算法,可判负环(如果一个点进队超过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 }
时间: 2024-11-05 13:39:05