从差分约束的代码里面摘过来的负环判断,不知道为啥就是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;
}