求助!!!卡#9#10
  • 板块灌水区
  • 楼主zhengzhuo1106
  • 当前回复17
  • 已保存回复17
  • 发布时间2024/8/22 10:02
  • 上次更新2024/8/22 11:53:53
查看原帖
求助!!!卡#9#10
307518
zhengzhuo1106楼主2024/8/22 10:02

无语了,卡点卡得emo,请路过的大佬帮帮忙!!!

题目:P3385 【模板】负环 我用的算法是spfa

#include<bits/stdc++.h>
#define MAX 0x3f
using namespace std;
const int N=10e3*3+10;
int head[N],ne[N],num[N],idx,w[N];
int fh[N];
int dis[N];
bool vis[N];
int t,n,m,mm;
void add(int x,int y,int z){
	idx++;
	num[idx]=y;
	ne[idx]=head[x];
	w[idx]=z;
	head[x]=idx;
}
void inti(){
	for(int i=0;i<=n;i++){
		dis[i]=MAX;
		head[i]=ne[i]=vis[i]=fh[i]=num[i]=w[i]=0;
	}
	idx=mm=0;
}
void spfa(){
	queue<int> h;
	dis[1]=0;
	vis[1]=1;
	fh[1]=1;
	h.push(1);
	while(h.size()!=0){
		int x=h.front();
		h.pop();
		vis[x]=0;
		for(int i=head[x];i;i=ne[i]){
			int y=num[i],z=w[i];
			if(dis[y]>dis[x]+z){
				dis[y]=dis[x]+z;
				if(vis[i]==0){
					h.push(y);
					fh[y]++;
					if(fh[y]>=m){
						cout<<"YES\n";
						return ;
					}
				}
			}
		}
	}
	cout<<"NO\n";
	return ;
}
signed main(){
	cin>>t;
	while(t--){
		cin>>n>>m;
		inti();
		for(int i=0;i<m;i++){
			int x,y,z;
			cin>>x>>y>>z;
			if(z>=0){
				add(x,y,z);
				add(y,x,z);
				mm++;
			}
			else add(x,y,z);
		}
		m+=mm;
		spfa();
	}
	return 0;
}
2024/8/22 10:02
加载中...