不能理解一个判负环的细节
查看原帖
不能理解一个判负环的细节
533003
_EEA_楼主2023/3/10 22:42

众所周知,用 SPFA 判负环只需判断有没有点入队的次数达到或超过节点数 nn 即可。

我想,每次入队时计数器 cntcnt 自增 11,然后立即进行判断,cntcnt 不可能实现从 n1n-1n+1n+1 的突变,必然会经历等于 nn 的时刻,于是判负环的代码片段我是这样写的:

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;
		}
	}
}

然而这样只有 9898

我很纳闷,直到当我无意间将其中的 ==改为 >= 后,过了。像这样:

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;
		}
	}
}

现在我百思不得其解,请求大佬解答。

2023/3/10 22:42
加载中...