spfa WA了三四点 求助大佬 orz
查看原帖
spfa WA了三四点 求助大佬 orz
219405
return666楼主2020/11/6 23:35
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=2020;
const int maxm=6050;
int first[maxn],to[maxm],next[maxm],val[maxm],tot;
int t,n,m,dis[maxn],num[maxn];
bool vis[maxn];
queue<int>q;
void add(int x,int y,int z)
{
	to[++tot]=y;
	next[tot]=first[x];
	first[x]=tot;
	val[tot]=z;
}
void clear()
{
	tot=0;
	memset(dis,0x7f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	memset(first,0,sizeof(first));
	memset(to,0,sizeof(to));
	memset(next,0,sizeof(next));
	memset(val,0,sizeof(val));
	memset(num,0,sizeof(num));
}
bool spfa(int s)
{
	dis[s]=0;
	q.push(s);
	vis[s]=1;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		num[u]++;
		if(num[u]>n) return 0;
		vis[u]=0;
		for(int i=first[u];i;i=next[i])
		{
			int v=to[i];
			if(dis[v]>dis[u]+val[i])
			{
				dis[v]=dis[u]+val[i];
				if(vis[u]) continue;
				q.push(v);
				vis[v]=1;
			}
		}
	}
	return 1;
}
int main()
{
	cin>>t;
	for(int i=1;i<=t;i++)
	{
		cin>>n>>m;
		clear();
		for(int j=1;j<=m;j++)
		{
			int x,y,z;
			cin>>x>>y>>z;
			if(z>=0)
			{
				add(x,y,z);
				add(y,x,z);
			}
			else
			{
				add(x,y,z);
			}
		}
		if(spfa(1))
		{
			cout<<"NO"<<endl;
		}
		else
		{
			cout<<"YES"<<endl;
		}
	} 
}
2020/11/6 23:35
加载中...