蒟蒻求助,第9个点一直过不去
查看原帖
蒟蒻求助,第9个点一直过不去
69288
zuytong楼主2021/9/22 20:28

本来想来复习一下SPFA的,结果给搞自闭了>_<

#include<iostream>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<set>
#include<map>
using namespace std;
inline int reads()
{
	int re=0,sign=1; char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') sign=-1; c=getchar();}
	while('0'<=c&&c<='9'){re=re*10ull+(c-'0'); c=getchar();}
	return re*sign;
}
int T=reads();
int n,m;
struct Node
{
	int to,next,len;
}r[6005];
int he[2005],cnt;
void add(int u,int v,int len)
{
	cnt++;
	r[cnt].to=v;
	r[cnt].len=len;
	r[cnt].next=he[u];
	he[u]=cnt;
}
int sum[2005],dis[2005];
bool ans;
void _init()
{
	memset(he,0,sizeof(he)); ans=false; memset(sum,0,sizeof(sum)); cnt=0;
	memset(r,0,sizeof(he));
}
void SPFA()
{
	queue <int> q;
	q.push(1);
	while(!q.empty())
	{
		int now=q.front(); q.pop();
		for(int i=he[now];i;i=r[i].next)
		{
			int to=r[i].to;
			if(dis[to]>dis[now]+r[i].len)
			{
				sum[to]=sum[now]+1;
				if(sum[to]>=n)
				{
					ans=true;
					return;
				}
				dis[to]=dis[now]+r[i].len;
				q.push(to);
			}
		}
	}
}
int main()
{
	while(T--)
	{
		_init();
		n=reads(); m=reads();
		for(int i=1;i<=m;i++){ int u=reads(),v=reads(),len=reads(); add(u,v,len); if(len>0) add(v,u,len);}
		dis[1]=0;
		for(int i=2;i<=n;i++) dis[i]=0x7fffffff;
		SPFA();
		if(ans) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}
2021/9/22 20:28
加载中...