众所周知,用 SPFA 判负环只需判断有没有点入队的次数达到或超过节点数 n 即可。
我想,每次入队时计数器 cnt 自增 1,然后立即进行判断,cnt 不可能实现从 n−1 到 n+1 的突变,必然会经历等于 n 的时刻,于是判负环的代码片段我是这样写的:
if(dis[ptr->first] > dis[t] + ptr->second){
dis[ptr->first] = dis[t] + ptr->second;
if(!vis[ptr->first]){
vis[ptr->first] = 1;
++cnt[ptr->first];
que.push(ptr->first);
if(cnt[ptr->first] == n){
return 1;
}
}
}
然而这样只有 98 分。
我很纳闷,直到当我无意间将其中的 ==改为 >= 后,过了。像这样:
if(dis[ptr->first] > dis[t] + ptr->second){
dis[ptr->first] = dis[t] + ptr->second;
if(!vis[ptr->first]){
vis[ptr->first] = 1;
++cnt[ptr->first];
que.push(ptr->first);
if(cnt[ptr->first] >= n){
return 1;
}
}
}
现在我百思不得其解,请求大佬解答。