POJ 3259 Wormholes Bellman-Ford找负环

题目来源:POJ 3259 Wormholes

题意:某人想回到过去 输入有2中类型的边 一种是正的 并且是双向的 另外一种是负的 是单向的 可以回到过去就输出YES 否则NO

思路:和UVa 558差不多 如果存在负环就可以通过这个负环一直无限时光倒流 找负环用SPFA或者Bellman-Ford

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = 510;
struct edge
{
	int u, v, t;
}a[5500];
int d[maxn];
int n, m;
bool Bellman_Ford()
{
	for(int i = 1; i <= n; i++)
		d[i] = 999999999;
	for(int i = 1; i < n; i++)
	{
		for(int j = 0; j < m; j++)
		{
			int u = a[j].u, v = a[j].v, t = a[j].t;
			if(d[v] > d[u] + t)
				d[v] = d[u] + t;
		}
	}
	for(int i = 0; i < m; i++)
	{
		int u = a[i].u, v = a[i].v, t = a[i].t;
		if(d[v] > d[u] + t)
			return true;
	}
	return false;
}
int main()
{
	int T;
	scanf("%d", &T);
	while(T--)
	{
		m = 0;
		int m1, m2;
		scanf("%d %d %d", &n, &m1, &m2);
		for(int i = 0; i < m1; i++)
		{
			int u, v, t;
			scanf("%d %d %d", &u, &v, &t);
			a[m].u = u;
			a[m].v = v;
			a[m++].t = t;
			a[m].u = v;
			a[m].v = u;
			a[m++].t = t;
		}
		for(int i = 0; i < m2; i++)
		{
			int u, v, t;
			scanf("%d %d %d", &u, &v, &t);
			a[m].u = u;
			a[m].v = v;
			a[m++].t = -t;
		}
		if(Bellman_Ford())
			puts("YES");
		else
			puts("NO");
	}
	return 0;
}

 

你可能感兴趣的:(POJ 3259 Wormholes Bellman-Ford找负环)