模板链接
用spfa找负环,当到一个点的最短路径超过n条时,则一定有负环。
时间:4148ms。
#include<bits/stdc++.h>
using namespace std;
int T,ver[60001],nxt[6001],hed[6001],tot,bian[6001],dian[2001],bj[2001],jl[2001],n,m;
void add(int x,int y,int z){
ver[++tot]=y,nxt[tot]=hed[x],hed[x]=tot,bian[tot]=z;
}
queue<int>q;
bool spfa(){
while(q.size()) q.pop();
q.push(1),bj[1]=1,jl[1]=0;
while(q.size()){
int x=q.front();
q.pop(),bj[x]=0;
for(int i=hed[x],y;i;i=nxt[i]){
y=ver[i];
if(jl[y]>jl[x]+bian[i]){
jl[y]=jl[x]+bian[i];
dian[y]=dian[x]+1;
if(dian[y]>=n)
return false;
if(!bj[y])
bj[y]=1,q.push(y);
}
}
}
return true;
}
int main(){
scanf("%d",&T);
while(T--){
tot=0;
bool q;
memset(dian,0,sizeof(dian));
memset(hed,0,sizeof(hed));
memset(nxt,0,sizeof(nxt));
memset(bj,0,sizeof(bj));
memset(jl,0x3f,sizeof(jl));
scanf("%d%d",&n,&m);
for(int i=1,mm,mmm,mmmm;i<=m;i++){
scanf("%d%d%d",&mm,&mmm,&mmmm);
add(mm,mmm,mmmm);
if(mmmm>=0)
add(mmm,mm,mmmm);
}
if(spfa()) printf("N0\n");
else printf("YE5\n");
}
return 0;
}