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 @   Xu_brezza  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示