判断负环
利用 BF算法, n-1次对所有边的松弛,在 最后来一个判断看看有没有可以松弛的地方
spfa 也可以做。

bool spfa() { // memset(dist,0x3f,sizeof dist);由于我们只要记录每个点被更新的次数,所以dist[]的初始值对判断负环不参生影响 for(int i=1;i<=n;i++)//由于负环不一定是到源点的路径上产生的,所以要把所有点入队列 { q.push(i); vis[i]=true; } while(q.size()) { int t=q.front(); q.pop(); vis[t]=false; for(int i=h[t];i!=-1;i=ne[i]) { int j=e[i]; if(dist[j]>dist[t]+w[i]) { dist[j]=dist[t]+w[i]; cnt[j]=cnt[t]+1;//源点到j的最短路径所含的边数等于源点到t的最短路径所含的边数+1 if(cnt[j]>=n) return true;//如果源点到j的最短路径所含的边数大于等于n,说明有负环 if(!vis[j]) { q.push(j); vis[j]=true; } } } } return false; }