help
查看原帖
help
1284873
LJQ0808楼主2024/12/13 14:30
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int> 
const int N=1e5+5;
int tcase;
int n,m,ww;
vector<pii> g[N];
bool vis[N];
int dis[N];
int cnt[N];
void add_edge(int x,int y,int z){
	g[x].push_back({y,z});
} 
queue<int> qq;
void spfa(){
	memset(vis,0,sizeof(vis)),memset(cnt,0,sizeof(cnt));
	memset(dis,0x3f,sizeof(dis));
	queue<int> q;
	vis[n+1]=cnt[n+1]=1;
	dis[n+1]=0;
	q.push(n+1);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(auto [v,w]:g[u]){
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				cnt[v]=cnt[u]+1;
				if(cnt[v]>n){
					cout<<"YES\n";
					return;
				}
				if(!vis[v]){
					vis[v]=1;
					q.push(v);
				}
			}
		} 
	}
	cout<<"NO\n";
}
signed main(){
	//HAPPY!
	cin.tie(0);
	cout.tie(0);
	ios_base::sync_with_stdio(0);
	cin>>tcase;
	while(tcase--){
		cin>>n>>m>>ww;
		for(int i=1;i<=m;i++){
			int x,y,z;
			cin>>x>>y>>z;
			add_edge(x,y,z);
			add_edge(y,x,z);
			add_edge(x,n+1,0);
			add_edge(n+1,x,0);
			add_edge(y,n+1,0);
			add_edge(n+1,y,0);
		}
		for(int i=1;i<=ww;i++){
			int x,y,z;
			cin>>x>>y>>z;
			add_edge(x,y,-z); 
			add_edge(x,n+1,0);
			add_edge(n+1,x,0);
			add_edge(y,n+1,0);
			add_edge(n+1,y,0);
		}
		spfa();
		for(int i=1;i<=n+1;i++){
			g[i].clear();
		}
	}
	return 0;
}

rt

2024/12/13 14:30
加载中...