SPFA判负环

负环:一个图中边权之和为负数的回路

原理很简单,在$spfa$每次入队一个点的时候判断一下该点入队次数,若大于等于$n$,则说明进行了至少$n$次松弛操作,这显然是不合法的,证明每次走这条路都会使最短路更短,也就是说这条路可以反复到达并且贡献为负,这便是有负环。

bool spfa_check(){
    memset(dis,inf,sizeof(dis));
    memset(cnt,0,sizeof(cnt));
    memset(vis,0,sizeof(vis));
    queue<int>q;
    q.push(1);
    dis[1] = 0;
    vis[1] = 1;
    while(!q.empty()){
        int u = q.front();q.pop();
        vis[u] = 0;
        for(int i=head[u];i;i=nxt[i]){
            int v = to[i];
            if(dis[u] + w[i]< dis[v] ){
            
                dis[v] = dis[u] + w[i];
                if(!vis[v]){
                    if(++cnt[v] >= n){
                        return 1;
                    }
                    vis[v] = 1;
                    q.push(v);
                }    
            }
        }
    }
    return 0 ;
}

 

posted @ 2022-02-18 08:26  Xu_brezza  阅读(58)  评论(0编辑  收藏  举报