求负环-超级源点
  • 板块学术版
  • 楼主Pink_Cut_Tree
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/3/11 17:42
  • 上次更新2024/3/11 18:32:53
查看原帖
求负环-超级源点
793625
Pink_Cut_Tree楼主2024/3/11 17:42

P2850 的代码

#include<bits/stdc++.h>
using namespace std;
const int N=505;
#define inf 2147483647
struct Edge{
	int to,value;
};
int T;
int n,m,ww;
int u,v,w;
vector<Edge>G[N];
queue<int>Q;
int dis[N],cnt[N];
bool vis[N];
bool spfa(){
	while(!Q.empty()){
		Q.pop();
	}
	for(int i=1;i<=n;i++){
		cnt[i]=vis[i]=0;
		dis[i]=inf;
	}
	cnt[0]=1;
	vis[0]=1; dis[0]=0;
	Q.push(0);
	while(!Q.empty()){
		int u=Q.front(); Q.pop();
		vis[u]=0;
		for(int i=0;i<G[u].size();i++){
			int v=G[u][i].to,w=G[u][i].value;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				if(vis[v]==0){
					vis[v]=1;
					Q.push(v);
					if(++cnt[v]>n){
						return 1;
					}
				}
			}
		}
	}
return 0;
}
int main(){
	cin.tie(0)->sync_with_stdio(0);
	cin>>T;
	while(T--){
		cin>>n>>m>>ww;
		memset(G,0,sizeof G);
		while(m--){
			cin>>u>>v>>w;
			G[u].push_back({v,w});
		}
		while(ww--){
			cin>>u>>v>>w;
			G[u].push_back({v,-w});
		}
		for(int i=1;i<=n;i++){
			G[0].push_back({i,0});
			G[i].push_back({0,0});
		}
		if(spfa()){
			cout<<"YES\n";
		}
		else{
			cout<<"NO\n";
		}
	}
return 0;
}

具体地,我令超级源点为 00,但会出现 0∼2∼00\sim 2\sim 0 的负环,这样怎么处理?

2024/3/11 17:42
加载中...