[USACO06DEC]虫洞Wormholes (负环模板)

题意::问一个图是否存在负环,虫洞一边的权值为负

思路:

dfs版spfa判环根据:若一个节点出现2次及以上,则存在负环.(你可以假想一下,当一个点被搜过时,再次深搜的话还能搜索到那不就说明存在负环嘛可能解释的不好,请见谅)
  {补充bfs版本:若一个节点入队列的次数超过n,则存在负环.}
  如果是bfs来实现的话,果断到达上限(T-L-E),而dfs版的话,就相对快一些.
  对于本题的强大数据来说,还需加入一定的优化:
  由于是负环,所以无需像一般的spfa一样初始化为极大的数,只需要初始化为0就够了(可以减少大量的搜索,但要注意最开始时for一遍)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int maxn=505;
 5 int inf=0xfffffff;
 6 int dis[maxn];
 7 bool ant[maxn];
 8 int n,m,w,flag;
 9 struct node
10 {
11     int to,val;
12     node(){}
13     node(int xx,int yy):to(xx),val(yy){}
14 };
15 vector<node> v[maxn];//本人喜欢用邻接表
16 void init()
17 {
18     for(int i=1;i<=n;i++)
19     {
20         v[i].clear();
21         dis[i]=0;
22         ant[i]=0;
23     }
24 }
25 void dfs_spfa(int x)
26 {
27     if(ant[x]){//只要有一个点走过两次说明存在负环,即可退出,并释放标记
28         ant[x]=0;
29         flag=1;
30         return ;
31     }
32     ant[x]=1;//标记表示走过
33     for(int i=0;i<v[x].size();i++)
34     {
35         node p=v[x][i];
36         if(dis[p.to]>dis[x]+p.val){
37             dis[p.to]=dis[x]+p.val;
38             dfs_spfa(p.to);
39             if(flag==1){
40                 ant[x]=0;return ;//存在负环的话就层层退出
41             }
42         }
43     }
44     ant[x]=0;//再次释放标记
45 }
46 int main()
47 {
48     int t;
49     scanf("%d",&t);
50     while(t--)
51     {
52         scanf("%d%d%d",&n,&m,&w);
53         init();
54         for(int i=1;i<=m;i++)
55         {
56             int a,b,c;
57             scanf("%d%d%d",&a,&b,&c);
58             v[a].push_back(node(b,c));
59             v[b].push_back(node(a,c));
60         }
61         for(int i=1;i<=w;i++)
62         {
63             int a,b,c;
64             scanf("%d%d%d",&a,&b,&c);
65             v[a].push_back(node(b,-c));
66         }
67         flag=0;
68         for(int i=1;i<=n;i++)
69         {
70             dfs_spfa(i);
71             if(flag){break;}
72         }
73         if(flag){
74             cout<<"YES"<<endl;
75         }
76         else{
77             cout<<"NO"<<endl;
78         }
79     }
80     return 0;
81 }

留给自己做模板用5555

原文地址:https://www.cnblogs.com/sj-gank/p/11498549.html

时间: 2024-10-08 19:46:40

[USACO06DEC]虫洞Wormholes (负环模板)的相关文章

Poj 3259 Wormholes 负环判断 SPFA &amp; BellmanFord

#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #include <

POJ 3259 Wormholes【最短路/SPFA判断负环模板】

农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M≤2500)条路径,W(1≤W≤200)个虫洞.FJ作为一个狂热的时间旅行的爱好者,他要做到以下几点:开始在一个区域,通过一些路径和虫洞旅行,他要回到最开时出发的那个区域出发前的时间.也许他就能遇到自己了:).为了帮助FJ找出这是否是可以或不可以,他会为你提供F个农场的完整的映射到(1≤F≤5).所有的路径所花时间都

UVALive - 4618 Wormholes(负环)

题目大意:给出出发点和终点和m个虫洞(虫洞的出发点,终点,生成时间和花费时间),问从起点到终点花费的最小时间 解题思路:关键是有负环,所以直接跑最短路算法的话会TLE,所以负环要处理一下 但是这个负环又不是负环,因为负环到一定程度的话,就会消失. 比如,到达时间小于虫洞的生成时间,那么负环就消失了,也就是说,负环内的点满足的最优情况就是到达时间刚好等于生成时间 所以,先找出负环,接着判断一下这个负环内的能节省的最多时间,然后将所有点都减去那个时间,那么负环就消失了 具体看代码 #include

洛谷 P2850 [USACO06DEC]虫洞Wormholes 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=2850 [题目描述] John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N (从1..N标号)块地,并有W个虫洞(有向边).其中1<=N<=500,1<=M<=2500,1<=W<=200.

【无聊放个模板系列】洛谷 负环 模板

还有这样ws卡bfs-spfa判负环的也是醉 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<cmath> 8 #include<stack> 9 using namespace std; 10 #d

[luogu3385]dfs_spfa判负环模板

解题关键:模板保存. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> #include<queue> #define inf 0x3f3f3f3f using namespace std; const int inf=0x3f3f3f3f; const in

洛谷—— P3385 【模板】负环

题目描述 暴力枚举/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

SPFA判负环

原理很简单,SPFA可以多次入队,那么如果一个点入队的次数比点的总数还要多,或是起点入队两次,那么这个图肯定存在负环 例题 Luogu P3385 [模板]负环 #include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<algorithm> using namespace std; struct zzz{ int f, t, len, nex; }

POJ-3259 Wormholes(判断负环、模板)

Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that is BEFORE you entered the wormhole! Eac