90分求助
查看原帖
90分求助
229957
Wu_while楼主2021/5/9 15:51
#include<iostream>
#include<cstdio>
#include<queue>
#define MAXN 20010
#define MAXM 60010
#define inf 1000007
using namespace std;
struct st
{
	int to;
	int dis;
	int nxt;
}edge[MAXM];
int head[MAXN],size;
void add(int from,int to,int dis)
{
	edge[++size].nxt=head[from];
	edge[size].to=to;
	edge[size].dis=dis;
	head[from]=size;
}
int n,m,s=1;
int cnt[MAXN];
int c[MAXN];
bool b[MAXN];
int u,v,w;
void init()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<MAXN;i++)
		head[i]=-1,cnt[i]=0,b[i]=0;
	for(int i=1;i<MAXN;i++)
		c[i]=inf;
	for(int i=1;i<MAXM;i++)
		edge[i].nxt=-1;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
		if(w>=0)
			add(v,u,w);
	}
}
bool spfa()
{
	queue<int> q;
	while(!q.empty())
		q.pop();
	c[s]=0;
	b[s]=1;
	q.push(s);
	cnt[s]=1;
	while(!q.empty())
	{
		u=q.front();
		q.pop();
		b[u]=0;
		for(int i=head[u];~i;i=edge[i].nxt)
		{
			v=edge[i].to,w=edge[i].dis;
			if(c[u]+w<c[v])
			{
				c[v]=c[u]+w;
				cnt[v]=cnt[u]+1;
				if(cnt[v]>n)
					return 1;
				if(!b[v])
				{
					q.push(v);
					b[v]=1;
				}
			}
		}
	}
	return 0;
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		init();
		if(spfa())
			cout<<"YES"<<endl;
		else
			cout<<"NO"<<endl;
	}
	return 0;
}

评测记录

2021/5/9 15:51
加载中...