今天发现洛谷上判负环的数据更新了。
然后更新了一下模板。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cmath> 5 #include<algorithm> 6 #include<queue> 7 using namespace std; 8 const int N=2100; 9 struct edge{ 10 int to,nxt,w; 11 }e[N*3]; 12 int book[N],dis[N],cnt[N],t,n,m,head[N],cnt1; 13 void add(int u,int v,int w){ 14 cnt1++; 15 e[cnt1].nxt=head[u]; 16 e[cnt1].to=v; 17 e[cnt1].w=w; 18 head[u]=cnt1; 19 } 20 void spfa(){ 21 for(int i=1;i<=n;i++)dis[i]=1999999999; 22 memset(book,0,sizeof(book)); 23 memset(cnt,0,sizeof(cnt)); 24 queue<int> q; 25 q.push(1); 26 dis[1]=0; 27 book[1]=1; 28 while(!q.empty()){ 29 int u=q.front(); 30 q.pop(); 31 book[u]=0; 32 for(int i=head[u];i;i=e[i].nxt){ 33 int v=e[i].to; 34 if(dis[v]>dis[u]+e[i].w){ 35 dis[v]=dis[u]+e[i].w; 36 cnt[v]=cnt[u]+1; 37 if(book[v]==0){ 38 book[v]=1; 39 q.push(v); 40 } 41 if(cnt[v]>=n){ 42 printf("YE5\n"); 43 return; 44 } 45 } 46 else{ 47 if(dis[v]==dis[u]+e[i].w&&e[i].w>0){ 48 cnt[v]+=cnt[u]; 49 if(cnt[v]>=n){ 50 printf("YE5\n"); 51 return ; 52 } 53 } 54 } 55 } 56 } 57 printf("N0\n"); 58 } 59 int main(){ 60 scanf("%d",&t); 61 for(int x=1;x<=t;x++){ 62 scanf("%d%d",&n,&m); 63 memset(head,0,sizeof(head)); 64 cnt1=0; 65 for(int i=1;i<=m;i++){ 66 int u,v,w; 67 scanf("%d%d%d",&u,&v,&w); 68 add(u,v,w); 69 if(w>=0)add(v,u,w); 70 } 71 spfa(); 72 } 73 return 0; 74 }