捞(玄关)
  • 板块学术版
  • 楼主___STAR___
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/9/11 20:47
  • 上次更新2024/9/12 08:54:09
查看原帖
捞(玄关)
947848
___STAR___楼主2024/9/11 20:47

根据SPFA模板改,不知道哪里有问题 题目

#include<bits/stdc++.h>
using namespace std;
const int N=4e3+10,INF=1e9;
int T,n;
int ne[N],to[N],head[N],w[N],idx;
int dist[N],cnt[N];
bool vis[N];
void add(int a,int b,int c)
{
	ne[idx]=head[a];
	to[idx]=b;
	w[idx]=c;
	head[a]=++idx;
}
bool spfa()
{
	memset(vis,0,sizeof vis);
	memset(cnt,0,sizeof cnt);
	for(int i=1;i<=n;i++) dist[i]=INF;
	dist[1]=0;
	queue<int> q;
	q.push(1);
	vis[1]=1;
	while(!q.empty())
	{
		int fron=q.front();
		q.pop();
		vis[fron]=0;
		for(int i=head[fron];i!=-1;i=ne[i])
		{
			int rea=to[i];
			if(dist[rea]>dist[fron]+w[i])
			{
				dist[rea]=dist[fron]+w[i];
				if(!vis[rea])
				{
					cnt[rea]=cnt[fron]+1;
					if(cnt[rea]>=n) return true;
					q.push(rea);
					vis[rea]=true;
				}
			}
		}
	}
	return false;
}
int main()
{
	cin>>T;
	while(T--)
	{
		memset(head,-1,sizeof head);
		memset(w,0,sizeof w);
		int n,m;cin>>n>>m;
		for(int i=1;i<=m;i++)
		{
			int a,b,c;cin>>a>>b>>c;
			add(a,b,c);
			if(c>=0) 
			add(b,a,c);
		}
		if(spfa()) cout<<"Yes\n";
		else cout<<"No\n";
	}
}
2024/9/11 20:47
加载中...