判断负环

利用 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;
}
View Code

 

posted @ 2022-05-24 20:43  VxiaohuanV  阅读(24)  评论(0编辑  收藏  举报