40pts求调
查看原帖
40pts求调
1097358
B_neutrino楼主2024/3/3 20:43
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10; 
int head[N],to[2*N],nxt[2*N],v[2*N],tot=-1,dis[N],cnt[N]={0};
bool vis[N];
int n,m,x,y,z;
void add(int x,int y,int w){
    to[++tot]=y;
    v[tot]=w;
    nxt[tot]=head[x];
    head[x]=tot;
}
queue<int> q;
bool spfa(int root){
	dis[root]=0;
	vis[root]=1;
	q.push(root);
	while(q.size()){
		int x=q.front();
		q.pop();
		vis[x]=0;
		for(int i=head[x];~i;i=nxt[i]){
			int y=to[i],z=v[i];
			if(dis[y]>dis[x]+z){
				dis[y]=dis[x]+z;
				cnt[y]=cnt[x]+1;
				if(cnt[y]>=n) return true;
				if(!vis[y]){
					q.push(y);
					vis[y]=true;
				}
			}
		}
	}
	return false;
}
int t;
int main(){
	scanf("%d",&t);
	while(t--){
		memset(dis,0x3f,sizeof(dis));
	    memset(vis,0,sizeof(vis));
	    memset(head,-1,sizeof(head));
	    scanf("%d%d",&n,&m);
		for(int i=1;i<=m;i++){
	        scanf("%d%d%d",&x,&y,&z);
	        if(z>=0){
	        	add(x,y,z);
	        	add(y,x,z);
			}
			else add(x,y,z);
	    }
	    if(spfa(1)) printf("YES\n");
		else printf("NO\n");
	}
    return 0;
}
2024/3/3 20:43
加载中...