SPFA判负环
1 struct edgs{int go,next,w;}e[maxm]; 2 double d[maxn]; 3 int n,m,tot,v[maxn],head[maxn]; 4 bool mark[maxn],flag; 5 void insert(int x,int y,int z) 6 { 7 e[++tot].go=y;e[tot].w=z;e[tot].next=head[x];head[x]=tot; 8 } 9 void spfa(int x) 10 { 11 if(mark[x]){flag=1;return;} 12 mark[x]=1; 13 for(int i=head[x],y;i;i=e[i].next) 14 if(d[x]+e[i].w<d[y=e[i].go]) 15 { 16 d[y]=d[x]+e[i].w; 17 spfa(y); 18 if(flag)return; 19 } 20 mark[x]=0; 21 } 22 bool check() 23 { 24 for(int i=1;i<=n;i++)d[i]=mark[i]=0; 25 flag=0; 26 for(int i=1;i<=n;i++) 27 { 28 spfa(i); 29 if(flag)return 1; 30 } 31 return 0; 32 }