UVA558 - Wormholes(BellmanFord判负环)

2024-08-24 03:58

本文主要是介绍UVA558 - Wormholes(BellmanFord判负环),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

UVA558 - Wormholes(BellmanFord判负环)

UVA558 - Wormholes

题目大意: 
有一个教授希望利用虫洞回到过去(还是从这个虫洞出来就到达了过去),给你虫洞形成的有向图,问教授能否回到过去。

解题思路: 
利用BellmanFord判负环,如果不存在负环的话,那么最多经过N - 1次迭代就可以得到最短路,因为形成最短路最多N - 1个节点(起点不算),但是如果存在了负环,那么就可以一直迭代,最短路会越来越小。可以利用这个性质来判断是否存在负环。

代码:

#include <cstdio>
#include <cstring>
#include <queue>const int maxn = 1005;
const int maxm = 2005;using namespace std;struct edge {int u, v;int d;
}e[maxm];const int INF = 0x7f7f7f7f;
int N, M;
int d[maxn];bool BellmanFord() {for (int i = 0; i < N; i++)d[i] = i == 0 ? 0 : INF;d[0] = 0;for (int k = 0; k < N - 1; k++) for (int i = 0; i < M; i++) {if (d[e[i].u] != INF && d[e[i].v] > d[e[i].u] + e[i].d)d[e[i].v] = d[e[i].u] + e[i].d;}for (int i = 0; i < M; i++)if (d[e[i].u] != INF && d[e[i].v] > d[e[i].u] + e[i].d) return true;return false;
}int main () {int T;scanf ("%d", &T);while (T--) {scanf ("%d%d", &N, &M);for (int i = 0; i < M; i++)scanf ("%d%d%d", &e[i].u, &e[i].v, &e[i].d);if (BellmanFord()) printf ("possible\n");elseprintf ("not possible\n");}return 0;
}

这篇关于UVA558 - Wormholes(BellmanFord判负环)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101382

相关文章

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int

【HDU】1317 XYZZY spfa判负环+floyd求传递闭包

传送门:【HDU】1317 XYZZY 题目分析:首先我们可以用spfa判最长路上是否有正权环,但是有正权环却不等价于能到达终点。这是我们还需要判断是否能从正权环中走到终点,这个可以用传递闭包搞定。如果没有正权环就看是否能从起点到终点就好了。 代码如下: #include <cstdio>#include <cstring>#include <algorithm>

poj 3259 Wormholes 最短路

题目大意:虫洞问题,现在有n个点,m条边,代表现在可以走的通路,比如从a到b和从b到a需要花费c时间,现在在地上出现了w个虫洞,虫洞的意义就是你从a到b话费的时间是-c(时间倒流,并且虫洞是单向的),现在问你从某个点开始走,能回到从前 解题思路:其实给出了坐标,这个时候就可以构成一张图,然后将回到从前理解为是否会出现负权环,用bellman-ford就可以解出了

最短路算法总结(dijkstra,flyod,bellmanford,spfa)

总结 d i j k s t r a dijkstra dijkstra h e a p − d i j k s t r a heap-dijkstra heap−dijkstra b e l l m a n f o r d bellmanford bellmanford s p f a spfa spfa f l o y d floyd floyd最短路类型单源单源单源单源全源数据维护 e

UVa12227/LA4618 Wormholes

UVa12227/LA4618 Wormholes 题目链接题意分析测试数据AC 代码 题目链接   本题是2009年icpc欧洲区域赛西北欧赛区的j题   UVA - 12227 Wormholes 题意   你有一艘星际飞船,飞船运行速度为1,打算从坐标a旅行到坐标b(出发时刻为0),已知n个虫洞(0≤n≤ 50)的信息:入口点坐标s,出口点坐标e,形成时间t,穿过虫洞

POJ3259 Wormholes 【Bellmanford判断是否存在负回路】

很简单的bellmanford题目,这里比较详细:http://blog.csdn.net/lyy289065406/article/details/6645790 直接代码 #include <cstdio>#include <cstdlib>#include <iostream>#include <algorithm>#include <cstring>#include <cma

洛谷 P2868 观光奶牛Sightseeing Cows 01分数规划 + 最短路判负环

按照惯例,不想写题目大意,转一个 https://blog.csdn.net/liangzihao1/article/details/79716799 题目描述 Farmer John has decided to reward his cows for their hard work by taking them on a tour of the big city! The cows mu

POJ - 3259 Wormholes(判断负环, Bellman Ford,SPFA)

虫洞能够时光倒流,判断能否在回到出发的位置的时候在出发的时候之前。(判断是否存在负环) 初学最短路,尝试着用了三种方法判断: 1、Bellman Ford (令d全部为0,仅用来判断负环)       OJ测试得157MS 2、Bellman Ford 结束后再来一轮松弛若松弛成功则存在负环。    235MS 3、Bellman Ford 用队列优化过的SPFA,判断是否存在一个点同队大

Wormholes POJ3259 (spfa)

题目:http://poj.org/problem?id=3259 题目大意:F组数据, 输入n, m, w,表示n块田地, m个田与田之间的关系,w个虫洞,从一块田到达另一块田需要花一定时间, 穿过虫洞时时间会倒流,问是否能够回到出发前的时间 解题思路:判断是否存在负环,若存在则一定能够回去。 #include<cstdio>#include<cstring>#include<algo

POJ 3259 *** Wormholes

题意:农场主有f个农场,每个农场有n个田地,m条路,w个虫洞,走路从田地s到田地e需要花费t1时间,而每个虫洞可以从田地q到田地p,且使得时间倒流t2。求对于每个农场,农场主是否能从田地i出发,回到田地i的时间是在他出发的时间之前? 想法:其实就是判断田地之间是否存在负循环,用bellmanford算法就可以了,但是还是WA了两次。因为我忽略了这m条路事实上是可以往返的。