PKU ACM 1860 Bellman - Ford 算法

第一次接触 Bellman - Ford 算法。然后做了一个关于这个算法的题目,自己太水,搞了半天也没有AC,参考别人代码了,不过最后还算是敲出来了

算法概要:算法采用松弛技术,对图中的所有边做松弛,松弛一共使用了 {V}-1次,因为图中最长的那条边的长度可能是 {V}-1条,所以经过 {V{-1次松弛,所有的边,都能松弛到最佳状态
算法导论里,这个算法用来求解,最短路径的,这道题目稍加改造,每个点的值不是最短路径,而是经过若干次交换币种后所剩下的钱,松弛的策略是使得钱越来越多。 
当松弛不下去的时候,说明没有+环,如果可以一直松弛,认为确实是由+环路,可以盈利

#include <iostream>
#include <fstream>
using namespace std;

struct Edge
{
	int a,b;
	double r,c;
};
double maxDistance[300];
bool bellman(int s,int n,int m,Edge *e,double v)
{
	int i,j;
	for( i = 0; i <= n; i++)
	{
		maxDistance[i] = -100000000;
	}
	maxDistance[s] = v;
	for( i = 0; i < n; i++)
	{
		bool stop = true;
		for( j = 0 ; j < m ; j++)
		{
			//从a到b b是目标点
			if(maxDistance[e[j].a] > 0 
				&& maxDistance[e[j].b] < (maxDistance[e[j].a] - e[j].c)*e[j].r)
			{
				maxDistance[e[j].b] = (maxDistance[e[j].a] - e[j].c)*e[j].r;
				stop = false;
			}
		}
		if(stop)
		{
			return false;
		}
	}
	return true;
}
int main()
{
	int n,m,s;
	int i,f,t;
	double fc,tc,fr,tr,v;
	Edge e[300];
	ifstream input;
	input.open("data.txt",std::ios::in);
	while(input>>n>>m>>s>>v)
	{
		for( i = 0; i < m; i++)
		{
			input>>f>>t>>fr>>fc>>tr>>tc;
			Edge e1 = {f,t,fr,fc};
			Edge e2 = {t,f,tr,tc};
			e[i] = e1;
			e[i+m] = e2;
		}
		if(bellman(s,n,2*m,e,v))
		{
			cout<<"YES"<<endl;
		}
		else
		{
			cout<<"NO"<<endl;
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值