poj3259 Bellman_ford算法

//poj3259 类似 poj1860, 探求能否出发,然后通过虫洞在出发前的时间点回来 
//如果单源最短路径构造之后,发现还是可以继续构造下去,说明某条路可以实现时间一直减的效果
//无限次走这条路,就可以达到目标。 
//dist的初始化大小搞错了 害的我WA了1次,RE了2次。。 
#include <iostream>
#include <string>
using namespace std;
int num;  //边数 
int dist[505];
int inf = 10005;
struct edge{
	int st;
	int ed;
	int w;
}e[6000];
void addEdge(int st, int ed, int t)
{
	e[num].st = st;
	e[num].ed = ed;
	e[num++].w = t;
}
bool CC(int nodeNum)
{
	for(int i = 0; i <= nodeNum; i++)
	{
		dist[i] = inf;	
	}
	dist[1] = 0;
	//构造单源(1)最短路径表
	bool flag = false; 
	for(int i = 0; i < nodeNum; i++)
	{
		for(int j = 0; j < num; j++)
		{
			int u = dist[e[j].st];
			int v = dist[e[j].ed];
			if(v > u + e[j].w)
			{
				dist[e[j].ed] = u + e[j].w;
				flag = true;
			}
		}
		if(!flag)
			break;
	} 
	for(int i = 0; i < num; i++)
	{
		if(dist[e[i].ed] > dist[e[i].st] + e[i].w) //如果还存在着负权环 
			return true;
	}
	return false;
}
int main()
{
	int f;
	cin>>f;
	while(f--)
	{
		num = 0;
		int n, m, worm;
		cin>>n>>m>>worm;
		int st, ed, t;
		for(int i = 0; i < m; i++)
		{
			cin>>st>>ed>>t;
			addEdge(st, ed, t);
			addEdge(ed, st, t);
		}
		for(int i = 0; i < worm; i++)
		{
			cin>>st>>ed>>t;
			addEdge(st, ed, -t);
		}	
		bool ok = CC(n);
		if(ok)
			cout<<"YES"<<endl;
		else
			cout<<"NO"<<endl;
	}
	return 0;
}

    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/chchlh/article/details/41490651
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞