20分求救
查看原帖
20分求救
1229761
xuzihan1楼主2024/8/28 09:54
#include<bits/stdc++.h>
using namespace std;
const int N=2000005;
int t;
int dis[N],n,m,cnt[N];
bool inQueue[N];
queue<int> Q;
vector<pair<int,int> > edges[N];
void SPFA(){
	memset(cnt,0,sizeof(cnt));
	memset(dis,0x3f,sizeof(dis));
	dis[1]=0;
	Q.push(1);
	inQueue[1]=true;
	while(!Q.empty()){
		int x=Q.front();
		Q.pop();
		inQueue[x]=false;
		for(auto edge:edges[x]){
			if(dis[edge.first]<=dis[x]+edge.second)
				continue;
			dis[edge.first]=dis[x]+edge.second;
			if(!inQueue[edge.first]){
				if(++cnt[edge.first]>=n){
					cout<<"YES"<<endl;
					return; 
				}
				Q.push(edge.first);
				inQueue[edge.first]=true;
			}
		}
	}
	cout<<"NO"<<endl;
}
int main()
{
	cin>>t;
	for(int i=1;i<=t;i++){
		cin>>n>>m;
		for(int i=1,u,v,w;i<=m;i++){
			cin>>u>>v>>w;
			if(w>=0){
				edges[u].emplace_back(v,w);
				edges[v].emplace_back(u,w);
			}
			else{
				edges[u].emplace_back(v,w);
			}
		}
		SPFA();
	}
	return 0;
}
2024/8/28 09:54
加载中...