POJ 3259 *** Wormholes

原创 2015年11月20日 11:23:59
题意:农场主有f个农场,每个农场有n个田地,m条路,w个虫洞,走路从田地s到田地e需要花费t1时间,而每个虫洞可以从田地q到田地p,且使得时间倒流t2。求对于每个农场,农场主是否能从田地i出发,回到田地i的时间是在他出发的时间之前?

想法:其实就是判断田地之间是否存在负循环,用bellmanford算法就可以了,但是还是WA了两次。因为我忽略了这m条路事实上是可以往返的。

代码如下:

#pragma warning(disable:4996)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<stack>
#include<cstring>
#include<sstream>
#include<set>
#include<string>
#include<iterator>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
const int INF = 0x3fffffff;

struct Path {
	int u;
	int v;
	int value;
}path[5500];

int dis[2000];

bool bellman(int source,int n,int way) {
	for (int i = 0; i <= n; ++i)
		dis[i] = INF;
	dis[source] = 0;
	int flag = 1;
	for (int i = 0; i < n&&flag; ++i) {
		flag = 0;
		for (int j = 0; j < way; ++j)
			if (dis[path[j].v]>dis[path[j].u] + path[j].value) {
				dis[path[j].v] = dis[path[j].u] + path[j].value;
				flag = 1;
			}
	}
	return !flag;
}

int main(void) {
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	int f, n, m, w;
	cin >> f;
	while (f--) {
		cin >> n >> m >> w;
		int u, v, value;
		for (int i = 0; i < m; ++i) {
			cin >> u >> v >> value;
			path[i * 2].u = path[i * 2 + 1].v = u;
			path[i * 2].v = path[i * 2 + 1].u = v;
			path[i * 2].value = path[i * 2 + 1].value = value;//往返都需要添加
		}
		for (int i = 0; i < w; ++i) {
			cin >> path[2*m + i].u >> path[2*m + i].v >> path[2*m + i].value;
			path[2*m + i].value = -path[2*m + i].value;
		}
		bool flag = 1;
		for (int i = 0; i < n&&flag; ++i)
			flag = bellman(i + 1, n, 2*m + w);
		if (flag)cout << "NO" << endl;
		else cout << "YES" << endl;
	}
	return 0;
}

poj3259 - Wormholes

想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410                              ...
  • wangjian8006
  • wangjian8006
  • 2012年08月16日 10:10
  • 5638

poj 3259 Wormholes题解

题目链接:http://poj.org/problem?id=3259 题意:给一个有n个点的图,这些点之间有m条双向的正权值边(两点之间最多一条),还有w条单向的负权值边(权值以正数给出)。判断是...
  • pai_pk
  • pai_pk
  • 2016年07月07日 19:23
  • 111

poj3259 Wormholes floyd求负环

POJ 3259 农夫约翰在探索他的许多农场,发现了一些惊人的虫洞。虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M...
  • yslcl12345
  • yslcl12345
  • 2016年01月24日 12:08
  • 2669

POJ 3259 Wormholes(SPFA算法判断是否存在负环)

Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 36755   Accepted: 13457...
  • zwj1452267376
  • zwj1452267376
  • 2015年08月19日 21:03
  • 775

POJ 3259 Wormholes

POJ 3259
  • qq_37495823
  • qq_37495823
  • 2017年08月10日 21:22
  • 51

poj 3259 Wormholes 最短路

Description While exploring his many farms, Farmer John has discovered a number of amazing wormhol...
  • zch3210
  • zch3210
  • 2016年11月27日 10:21
  • 100

E - POJ 3259 Wormholes

题意:有一个穿越时光的农夫,他有N个农场,每个农场有M条双向路,有W个单向虫洞,每条路有三个属性(s,e,t)分别代表的是从s到达e花费t时间,每个虫洞也有三个属性(s,e,t)分别代表的是s到达e花...
  • qq_39570759
  • qq_39570759
  • 2018年02月15日 19:41
  • 5

poj 3259 Wormholes bellman

题意 John的农场里N块地,M条路连接两块地(双向),w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts(即是一条单向负权边)。我们的任务是知道会不会在从某块地出发后又回来,看...
  • A_loud_name
  • A_loud_name
  • 2016年04月14日 21:16
  • 309

poj 3259 Wormholes (Bellman-ford)

Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 39574   Acc...
  • yao1373446012
  • yao1373446012
  • 2016年02月27日 20:14
  • 162

POJ 3259 Wormholes (bellman_ford)

题目链接:~( ̄▽ ̄~)(~ ̄▽ ̄)~ 资料链接:\(▔▽▔)/ code: #include int n = 0, m = 0, w = 0, count = 0; t...
  • ulquiorra0cifer
  • ulquiorra0cifer
  • 2012年04月02日 19:23
  • 266
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 3259 *** Wormholes
举报原因:
原因补充:

(最多只允许输入30个字)