SPFA 84分求调 WA#9#10,悬关,谢谢!
查看原帖
SPFA 84分求调 WA#9#10,悬关,谢谢!
546681
lcbridgeAK CSP-S楼主2023/3/28 20:06
#include <bits/stdc++.h>
using namespace std;
const int MAXN=2005;
const int MAXM=3005;
int T,n,m;
int num[MAXN],dis[MAXN];
bool vis[MAXN];
struct edge{
	int to,w;
};
vector <edge> g[MAXM*2];
int main(){
	scanf("%d",&T);
	while(T--){
		bool f=0;
		memset(num,0,sizeof(num));
		memset(vis,0,sizeof(vis));
		fill(dis+1,dis+n+1,0x3f3f3f3f);
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++)g[i].clear();
		for(int i=1;i<=m;i++){
			int u,v,w;
			scanf("%d%d%d",&u,&v,&w);
			if(w>=0){
				g[u].push_back({v,w});
				g[v].push_back({u,w});
			}
			else g[u].push_back({v,w});
		}
		queue <int> q;
		q.push(1);
		dis[1]=0;
		vis[1]=1;
		num[1]++;
		while(!q.empty()){
			int u=q.front();
			q.pop();
			vis[u]=0;
			for(int i=0;i<g[u].size();i++){
				int v=g[u][i].to;
				if(dis[v]>dis[u]+g[u][i].w){
					dis[v]=dis[u]+g[u][i].w;
					if(!vis[v]){
						vis[v]=1;
						q.push(v);
						num[v]++;
						if(num[v]>=n){
							printf("YES\n");
							f=1;
							break;
						}
					}
					if(f)break;
				}
			}
			if(f)break;
		}
		if(!f)printf("NO\n");
	}
	return 0;
}
2023/3/28 20:06
加载中...