蒟蒻求助,悬赏一关
查看原帖
蒟蒻求助,悬赏一关
831879
fchwpo楼主2023/3/22 13:26
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t;
int s;
int n,m;
//要判断入队次数而不是松弛次数(重边) 
const int maxn=2e3+5;
const int inf=0x7fffffff;
const int maxm=3e3+5;
int dis[maxn];
int vis[maxn];
int head[maxn];
struct node{
	int to,nxt,w;
}p[maxm<<1];
int cntt;
int cnt[maxn];
void add(int x,int y,int z){
	p[++cntt].to=y;
	p[cntt].nxt=head[x];
	p[cntt].w=z;
	head[x]=cntt;
}

void spfa(){
	queue<int>q;e
	for(int i=1;i<=n;i++){
		dis[i]=inf;
		vis[i]=0;
		cnt[i]=0;
	}
	q.push(1);
	dis[1]=0;
	cnt[1]++;
	vis[1]=1;//出入队标记 
	while(!q.empty()){
		int a=q.front();
		q.pop();
		vis[a]=0;
		for(int i=head[a];i;i=p[i].nxt){
			int v=p[i].to;
			if(dis[v]>dis[a]+p[i].w){
				dis[v]=dis[a]+p[i].w;
				if(!vis[v]){
				cnt[v]++;
				if(cnt[v]>=n){
					cout<<"YES"<<endl;
					return;
				}
					q.push(v);
					vis[v]=1;			
				}
			}
			
		} 
	} 
	cout<<"NO"<<endl;
}
signed main(){
	ios::sync_with_stdio(false);
	int t;
	int n,m;
	cin>>t;
	while(t--){
		cntt=0;
		memset(head,0,sizeof(head));
		//memset(p,0,sizeof(p));//
		cin>>n>>m;
		for(int i=1;i<=m;i++){
			int aa,bb,cc;
			cin>>aa>>bb>>cc;
			if(cc>=0){
				add(aa,bb,cc);
				add(bb,aa,cc);
				continue;			
			}
			add(aa,bb,cc);
		} 
		spfa();
	}
	return 0;
} 
2023/3/22 13:26
加载中...