WA#9求助
查看原帖
WA#9求助
697945
Tian36309楼主2023/12/22 20:25

从差分约束的代码里面摘过来的负环判断,不知道为啥就是WA#9,下载下来发现标准输出和我的输出正好相反???

我的代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int T,n,m,u,v,w,cnt2,flag;
struct edge{
	int u,v,w;
}d[15005];
int s[5005];
bool cmp(edge x,edge y){
	return x.u < y.u;
}
struct AB{
	ll b,c;
	bool operator < (const AB &A)const{
		return c > A.c;
	}
};
priority_queue<AB>q;
ll dis[5005],cnt[5005];
int main(){
	freopen("P3385_9.in","r",stdin);
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);
		cnt2 = 0;
		for(int i=1;i<=m;i++){
			scanf("%d%d%d",&u,&v,&w);
			if(w >= 0){
				cnt2++;
				d[i].u = d[i+m].v = u;
				d[i].v = d[i+m].u = v;
				d[i].w = d[i+m].w = w;
			}
			else{
				d[i].u = u;
				d[i].v = v;
				d[i].w = w;
			}
		}
		m+=cnt2;
		sort(d+1,d+m+1,cmp);
		memset(s,0,sizeof(s));
		for(int i=1;i<=m;i++){
			if(d[i].u != d[i-1].u)s[d[i].u] = i;
		}
		s[n+1] = m+1;
		for(int i=n;i>=1;i--)if(s[i] == 0)s[i] = s[i+1];
		memset(dis,31,sizeof(dis));
		memset(cnt,0,sizeof(cnt));
		dis[1] = 0;
		q.push({1,0});
		cnt[1]++;
		flag = 1;
		while(!q.empty()){
			
			int k=q.top().b;
			q.pop();
			
			
			for(int i=s[k];i<s[k+1];i++){
				if(dis[d[i].v] > dis[k]+d[i].w){
					dis[d[i].v] = dis[k]+d[i].w;
					q.push({d[i].v,dis[d[i].v]});
					cnt[d[i].v]++;
					if(cnt[d[i].v] >= n){
						printf("YES\n");
						flag = 0;
						break;
					}
				}
			}
			if(!flag)break;
		}
		while(!q.empty())q.pop();
		if(flag) printf("NO\n");
		for(int i=1;i<=m;i++){
			d[i].u = d[i].v = d[i].w = 0;
		}
	}
	return 0;
}
2023/12/22 20:25
加载中...