SPFA20pts求助
查看原帖
SPFA20pts求助
666741
_wakeup楼主2023/9/20 12:49
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<queue>
#include<vector>
#define ll long long
#define INF 2147483647
using namespace std;
ll T,n,m,tot,dis[2010],vis[2010],h[2010],cnt[2010];
ll to[20010],nxt[20010],val[20010];
queue<int> q; 
void add(int u,int v,int w)
{
	nxt[++tot]=h[u],to[tot]=v,val[tot]=w,h[u]=tot;
}
int spfa()
{
	for(int i=1;i<=n;i++)dis[i]=INF,vis[i]=0;
	q.push(1);
	dis[1]=0,vis[1]=1,cnt[1]++;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		vis[u]=1;
		for(int i=h[u];i;i=nxt[i])
		{
			int v=to[i];
			if(dis[v]>dis[u]+val[i])
			{
				dis[v]=dis[u]+val[i];
				if(vis[v]==0)
				{
					vis[v]=1,cnt[v]++;
					q.push(v);
					if(cnt[v]>n)return 1;
				 } 
			} 
		}
	}
	return 0;
}
int main()
{
	cin>>T;
	while(T--)
	{
		memset(h,0,sizeof(h));
        memset(dis,0,sizeof(dis));
        memset(cnt,0,sizeof(cnt));
        memset(vis,0,sizeof(vis));
        memset(val,0,sizeof(val));
        memset(to,0,sizeof(to));
        memset(nxt,0,sizeof(nxt));
		cin>>n>>m;
		int u,v,w;
		for(int i=1;i<=m;i++)
		{
			cin>>u>>v>>w;
			add(u,v,w);
		}
		if(spfa())cout<<"YES"<<endl;
		else cout<<"NO"<<endl; 
	}
	return 0;
}
2023/9/20 12:49
加载中...