洛谷—— P3385 【模板】负环

https://www.luogu.org/problem/show?pid=3385#sub

题目描述

暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索

输入输出格式

输入格式:

 

第一行一个正整数T表示数据组数,对于每组数据:

第一行两个正整数N M,表示图有N个顶点,M条边

接下来M行,每行三个整数a b w,表示a->b有一条权值为w的边(若w<0则为单向,否则双向)

 

输出格式:

 

共T行。对于每组数据,存在负环则输出一行"YE5"(不含引号),否则输出一行"N0"(不含引号)。

 

输入输出样例

输入样例#1:
2
3 4
1 2 2
1 3 4
2 3 1
3 1 -3
3 3
1 2 3
2 3 4
3 1 -8
输出样例#1:
N0
YE5

说明

N,M,|w|≤200 000;1≤a,b≤N;T≤10 建议复制输出格式中的字符串。

此题普通Bellman-Ford或BFS-SPFA会TLE

 

不能用百分数,就用电风扇~~~

 

 1 #include <algorithm>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <queue> 
 5 
 6 using namespace std;
 7 
 8 const int N(200000+5);
 9 int t,n,m,u,v,w;
10 int sumedge,head[N];
11 struct Edge
12 {
13     int to,next,cost;
14     Edge(int to=0,int next=0,int cost=0):
15         to(to),next(next),cost(cost) {}
16 }edge[N<<1];
17 
18 void ins(int from,int to,int cost)
19 {
20     /*++sumedge;
21     edge[sumedge].to=to;
22     edge[sumedge].next=head[from];
23     edge[sumedge].cost=cost;*/
24     edge[++sumedge]=Edge(to,head[from],cost);
25     head[from]=sumedge;
26 }
27 
28 int dis[N],vis[N],if_;
29 
30 void SPFA(int now)
31 {
32     vis[now]=1;
33     for(int i=head[now];i;i=edge[i].next)
34     {
35         int go=edge[i].to;
36         if(dis[go]>dis[now]+edge[i].cost)
37         {
38             if(vis[go]||if_)
39             {
40                 if_=1;
41                 break;
42             }
43             dis[go]=dis[now]+edge[i].cost;
44             SPFA(go);
45         }
46     }
47     vis[now]=0;
48 }
49 
50 void init()
51 {
52     memset(dis,0,sizeof(dis));
53     memset(vis,0,sizeof(vis));
54     memset(head,0,sizeof(head));
55     if_=sumedge=0;
56 }
57 
58 int main()
59 {
60     scanf("%d",&t);
61     for(;t;t--)
62     {
63         scanf("%d%d",&n,&m);
64         init();
65         for(int i=1;i<=m;i++)
66         {
67             scanf("%d%d%d",&u,&v,&w);
68             ins(u,v,w);
69             if(w>=0) ins(v,u,w);
70         }
71         for(int i=1;i<=n;i++)
72         {
73             SPFA(i);
74             if(if_) break;
75         }
76         if(if_) printf("YE5\n");
77         else printf("N0\n");
78     }    
79     return 0;
80 }

 

posted @ 2017-05-20 18:03  Aptal丶  阅读(289)  评论(0编辑  收藏  举报