90pts求助
查看原帖
90pts求助
508558
Cybrex楼主2024/10/24 08:02
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e4+10;
struct node{
	int v,w;
};
bool operator<(node x,node y){
	return x.w<y.w;
}
vector<node> g[N];
const int INF=1e18;
int vis[N],lc[N],dis[N];
int n,m;
int spfa(){
	for(int i=1;i<=n;i++){
		dis[i]=INF;
		lc[i]=0;
		vis[i]=0;
	}
	deque<node> q;
	q.push_back({1,0});
	dis[1]=0;
	vis[1]=1;
	while(!q.empty()){
		if(rand()%1000==1){
			sort(q.begin(),q.end());
		}
		int u=q.front().v;
		q.pop_front();
		vis[u]=0;
		if(lc[u]>=n+1){
			return 1;
		}
		for(int i=0;i<g[u].size();i++){
			int v=g[u][i].v;
			int w=g[u][i].w;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				if(!vis[v]){
					vis[v]=1;
					lc[v]++;
					if(!q.empty()&&dis[v]>dis[q.front().v]){
						q.push_back({v,dis[v]});
					}
					else{
						q.push_front({v,dis[v]});
					}
				}
			}
		}
	}
	return 0;
}
void so(){
	cin>>n>>m;
	for(int i=0;i<=n;i++){
		g[i].clear();
	}
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		if(w>=0){
			g[u].push_back({v,w});
			g[v].push_back({u,w});
		}
		else{
			g[u].push_back({v,w});
		}
	}
	cout<<(spfa()?"YES":"NO")<<'\n';
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	for(int i=1;i<=t;i++){
		so();
	}
	
	return 0;
}
2024/10/24 08:02
加载中...