模板

亡梦爱人 提交于 2019-12-03 07:17:27

负环

 1 #include<bits/stdc++.h>
 2 #define I inline
 3 using namespace std;
 4 using namespace std;
 5 const int N=2010;
 6 const int M=3010;
 7 I int read()
 8 {
 9     int x=0,f=1;char ch=getchar();
10     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
11     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
12     return x*f;
13 }
14 
15 struct node
16 {
17     int nxt,to,dis;
18 }g[M<<1];
19 int head[N],tot;
20 int T,n,m;
21 int dist[N],cnt[N];
22 bool vis[N];
23 
24 I void addedge(int u,int v,int dis)
25 {
26     g[++tot].nxt=head[u];
27     g[tot].to=v;
28     g[tot].dis=dis;
29     head[u]=tot;
30 }
31 
32 I bool spfa()
33 {
34     memset(vis,0,sizeof(vis));
35     memset(cnt,0,sizeof(cnt));
36     memset(dist,127,sizeof(dist));
37     queue<int>q;q.push(1);vis[1]=0;dist[1]=0;
38     while(q.size())
39     {
40         int u=q.front();q.pop();vis[u]=0;
41         for(int i=head[u];i;i=g[i].nxt)
42         {
43             int v=g[i].to;
44             if(dist[v]>dist[u]+g[i].dis)
45             {
46                 cnt[v]=cnt[u]+1;
47                 if(cnt[v]>n)return 1;
48                 dist[v]=dist[u]+g[i].dis;
49                 if(!vis[v])vis[v]=1,q.push(v);
50             }
51         }
52     }
53     return 0;
54 }
55                 
56 
57 int main()
58 {
59     T=read();
60     while(T--)
61     {
62         n=read();m=read();tot=0;
63         memset(head,0,sizeof(head));
64         for(int i=1;i<=m;i++)
65         {
66             int x=read(),y=read(),z=read();
67             if(z<0)addedge(x,y,z);
68             else addedge(y,x,z),addedge(x,y,z);
69         }
70         if(spfa())puts("YE5");
71         else puts("N0");
72     }
73 }
show you the code

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!