SPFA wa#9 line 2
查看原帖
SPFA wa#9 line 2
1127991
Antipole楼主2024/8/29 18:29
#include<cstdio>
#include<vector>
#include<string.h>
#include<queue>
#define int long long
inline void r(int &x)
{
    char c;
    int bl=1;
    while((c=getchar())<'0') if(c=='-') bl=-1;;
    x=c^'0';
    while((c=getchar())>='0') x=(x<<3)+(x<<1)+(c^'0');
    x*=bl;
}
const int maxn=2e3+10;
int n,m,dis[maxn],vis[maxn],cnt[maxn];
struct edge{int t,w;};
std::vector<edge>v[maxn];
inline void clear(){for(int i=1;i<=n;i++) v[i].clear(),vis[i]=0,cnt[i]=0;}
inline void add(int s,int e,int w)
{
	if(w>=0) v[s].push_back({e,w}),v[e].push_back({s,w});
	else v[s].push_back({e,w});
}
bool spfa()
{
	memset(dis,0x3f,sizeof dis);
	std::deque<int>q;
	q.push_back(1),dis[1]=0,vis[1]=1;
	cnt[1]=1;
	while(!q.empty())
	{
		int x=q.front();
		q.pop_front();
		vis[x]=0,cnt[x]++;
		for(int i=0;i<v[x].size();i++)
		{
			int t=v[x][i].t,w=v[x][i].w;
			if(dis[t]>dis[x]+w)
			{
				dis[t]=dis[x]+w;
				if(!vis[t]) 
				{
					vis[t]=1;
					if(++cnt[t]>=n) return 1;
					if(q.empty()) q.push_back(t);
					else if(dis[t]>=dis[q.front()]) q.push_back(t);
					else q.push_front(t);
				}
			}
		}
	}
	return 0;
}
signed main()
{
	int t,s,e,w;
	r(t);
	while(t--)
	{
		r(n),r(m);
		while(m--) r(s),r(e),r(w),add(s,e,w);
		printf((spfa()?"YES\n":"NO\n"));
		clear();
	}
    return 0;
}
2024/8/29 18:29
加载中...