判负环(spfa)

今天发现洛谷上判负环的数据更新了。

然后更新了一下模板。

 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 }
View Code

猜你喜欢

转载自www.cnblogs.com/Xu-daxia/p/9428432.html
今日推荐