无语了,卡点卡得emo,请路过的大佬帮帮忙!!!
题目:P3385 【模板】负环 我用的算法是spfa
#include<bits/stdc++.h>
#define MAX 0x3f
using namespace std;
const int N=10e3*3+10;
int head[N],ne[N],num[N],idx,w[N];
int fh[N];
int dis[N];
bool vis[N];
int t,n,m,mm;
void add(int x,int y,int z){
idx++;
num[idx]=y;
ne[idx]=head[x];
w[idx]=z;
head[x]=idx;
}
void inti(){
for(int i=0;i<=n;i++){
dis[i]=MAX;
head[i]=ne[i]=vis[i]=fh[i]=num[i]=w[i]=0;
}
idx=mm=0;
}
void spfa(){
queue<int> h;
dis[1]=0;
vis[1]=1;
fh[1]=1;
h.push(1);
while(h.size()!=0){
int x=h.front();
h.pop();
vis[x]=0;
for(int i=head[x];i;i=ne[i]){
int y=num[i],z=w[i];
if(dis[y]>dis[x]+z){
dis[y]=dis[x]+z;
if(vis[i]==0){
h.push(y);
fh[y]++;
if(fh[y]>=m){
cout<<"YES\n";
return ;
}
}
}
}
}
cout<<"NO\n";
return ;
}
signed main(){
cin>>t;
while(t--){
cin>>n>>m;
inti();
for(int i=0;i<m;i++){
int x,y,z;
cin>>x>>y>>z;
if(z>=0){
add(x,y,z);
add(y,x,z);
mm++;
}
else add(x,y,z);
}
m+=mm;
spfa();
}
return 0;
}