题意:

农夫约翰农场里发现了很多虫洞,他是个超级冒险迷,想利用虫洞回到过去,看再回来的时候能不能看到没有离开之前的自己,农场里有N块地,M条路连接着两块地,W个虫洞,连接两块地的路是双向的,而虫洞是单向的,去到虫洞之后时间会倒退T秒,如果能遇到离开之前的自己就输出YES,反之就是NO。

分析:

就是求一幅图中有没有负权环路, 可以bellman n-1次后再跑一次看看能不能更新, 能更新说明有环。

也可以spfa记录入队次数, 入队次数大于等于N说明有负权环路

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define rep(i,a,b) for(int i = a; i < b; i++)
#define _rep(i,a,b) for(int i = a; i <= b; i++)
using namespace std;
#define inf 0x3f3f3f3f
const int maxn = 1000, maxm = 10000;
int N,M,W;
struct E
{int v, time, nxt;
}Edge[maxm];int cnt = 0;
int head[maxn], enter_cnt[maxn];
int dis[maxn], vis[maxn];
void add_edge(int u , int v, int d){Edge[cnt].v = v;Edge[cnt].time = d;Edge[cnt].nxt = head[u];head[u] = cnt++;
}
bool spfa(){fill(dis, dis+maxn, inf);memset(vis, 0, sizeof(vis));memset(enter_cnt, 0, sizeof(enter_cnt));queue<int> q;q.push(1);dis[1] = 0;vis[1] = 1;enter_cnt[1]++;while(!q.empty()){int u = q.front();for(int i = head[u]; i != -1; i = Edge[i].nxt){int v = Edge[i].v, d = Edge[i].time;if(dis[v] > dis[u] + d){if(++enter_cnt[v] >= N) return false; //如果入队次数 >= N, 那么一定有负权环路 dis[v] = dis[u] + d;if(!vis[v]){vis[v] = 1;q.push(v);}}}vis[u] = 0;q.pop();}return true;
}
int main()
{int T;scanf("%d", &T);while(T--){memset(head, -1, sizeof(head));cnt = 0;scanf("%d %d %d", &N, &M, &W);for(int i = 0; i < M; i++){int tu,tv,tt;scanf("%d %d %d", &tu, &tv, &tt);add_edge(tu,tv,tt);add_edge(tv,tu,tt);}for(int i = 0; i < W; i++){int tu,tv,tt;scanf("%d %d %d", &tu, &tv, &tt);add_edge(tu,tv,-tt);}if(!spfa()) printf("YES\n");else printf("NO\n");}
}

转载于:https://www.cnblogs.com/Jadon97/p/8340657.html

POJ 3259 Wormholes(负权环路)相关推荐

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

    农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M≤2500)条路径 ...

  2. POJ 3259 Wormholes(bellman_ford,判断有没有负环回路)

    题意:John的农场里field块地,path条路连接两块地,hole个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts.我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前 ...

  3. POJ - 3259 Wormholes(判断负环)

    题目链接:点击查看 题意:最短路判断负环 这里介绍三种方法判断负环,分别是spfa,bellman-ford和flyod算法,不过spfa的速度能比bellman-ford的速度慢了接近20倍是出乎 ...

  4. POJ 3259 Wormholes SPFA判负环

    思路:SPFA判负环 数组不要开太小-- (后面附一组测试数组) // by SiriusRen #include <queue> #include <cstdio> #inc ...

  5. POJ 3259 Wormholes

    题目链接 题意 问是否存在负环 AC 因为Dijkstra不能处理带有负边权的图,可以用spfa 和 BellmenFord spfa using namespace std; int inf = 0 ...

  6. 【POJ/算法】 3259 Wormholes(Bellman-Ford算法, SPFA ,FLoyd算法)

    Bellman-Ford算法 Bellman-Ford算法的优点是可以发现负圈,缺点是时间复杂度比Dijkstra算法高.而SPFA算法是使用队列优化的Bellman-Ford版本,其在时间复杂度和编 ...

  7. 【POJ】3259 Wormholes

    题目链接:http://poj.org/problem?id=3259 题意:n个农场,m条双向路径,w条单向路径(虫洞).单向虫洞路径是负值.农夫想知道自己能不能看到自己(X). 题解:其实刚开始没 ...

  8. 【POJ - 3249】Test for Job(DAG线性求带负权的最长路,dp)

    题干: Mr.Dog was fired by his company. In order to support his family, he must find a new job as soon ...

  9. 差分约束系统之Bellman_Ford与Spfa判断负权回路

    题目:http://poj.org/problem?id=1364 题意:就是简单的差分约束模型. 分析:首先我们必须知道,如果图中存在负权回路,那么差分约束没有可行解.而存在负权回路的条件是:图中某 ...

最新文章

  1. 方立勋_30天掌握JavaWeb_jdbc实现客户关系管理(未完)
  2. ASP.NET编程技巧
  3. 卷积在计算机中实现+pool作用+数据预处理目的+特征归一化+理解BN+感受野理解与计算+梯度回传+NMS/soft NMS
  4. Storm案例:统计单词个数
  5. DCMTK:Receiving Images from PACS using DCMSCU
  6. 《Android 应用案例开发大全(第二版)》——2.3节案例的基本框架
  7. grasshop 犀牛5.0下载_神契幻奇谭 v1.129版发布 快来下载神契幻奇谭2020最新官方版...
  8. Atitit 写的计算机技术类的书 与it类紧密的学科 atiitt it学科体系化 体系树与知识点概念大总结 v3 t88.xlsx 门类 学科一级分类 专业、二级学科分类 课程 书籍 工学
  9. JavaScript基础视频教程总结(011-020章)
  10. 谁有html制作3d浪漫相册有代码,3D相册制作代码
  11. java生成随机数的代码_java生成随机数的代码
  12. Excel设置下拉选项
  13. unilx安装mysql_内容更新 · web-liuyang/uni-app-tools@72f7fd7 · GitHub
  14. 成都千锋培训python就业班
  15. 蓝牙鼠标windows linux,解决Ubuntu 18.04与Windows 10双系统蓝牙鼠标连接的问题
  16. 2015级移动本面向对象课程主页
  17. 数据结构—栈与队列【顺序存储、链式存储、卡特兰数、优先级队列】
  18. 异常收集 ----雨之殇
  19. 【5G核心网】5G概念以及名词缩写解释
  20. Spring-aop实现工厂代理与自动代理

热门文章

  1. 动态调用WCF不添加服务(svcutil.exe)
  2. 那些年我们一起追过的缓存写法(二)
  3. 50个国内外最棒的C/C++源码站点分享
  4. 黄聪:IE6下css大bug:文字神秘消失,鼠标选择了才出现
  5. 设计模式系列3-----C++实现命令模式(Command Pattern)
  6. Flex使用mx:Tree控件创建树(可添加和删除节点)
  7. 使用饼图_常见图表规范:直方图、圆环图和饼图
  8. 数字下变频和数字上变频
  9. 几种和生成网络相似的纠缠网络(接近人脑)
  10. pytorch定义神经卷积网络CNN源码