poj 2240-Arbitrage Bellman-ford算法

       怎么说呢,开学两天了,总感觉时间不够用的,这也不错,可以彻底治一治自己的拖拉低效的毛病,还有就是现在无法感受到一种激情,那种由于自己冥思苦想切出题来的快感,从1007开始,我在poj上集中了图论的知识,靠着一本教科书将代码与部分算法表达出来,可是,这样的后果就是没有味道,如同吃过别人吐出来的饭菜那样恶心,而完全凭自己的实力去想,根本连北都找不到方向,关键的关键,这几个求最短路径问题的算法我能知道是怎么求的,但就是无法运用自己,就像自己掌握的那些初高中的数学知识.在网上找了找问答,他们说对付这种情况就是练习,还有哥们说那你就吃饭想,睡觉想,整个人完全沉浸在其中.我现在的问题不是完全看不同,就是总感觉有一点没透,自己不管怎样,坚持下去,完成自己对自己的承诺,那就每天完成一定的代码与理论知识.

     ————————————————–分割线—————————————

       套汇问题:假定1美元兑换0.5英镑,1英镑兑换10.0法郎,1法郎兑换0.21美元,那么,一个聪明的商人就可以用1美元兑换0.5*10.0*0.21=1.05美元,获利%5,请你根据外汇列表测试是否存在套汇.

       我们将每种货币看成一个顶点,两种货币之间的汇率看成权值,这样就可以看成从源点出发,经过各点回到自己的一条回路,我们把每条路径上的权值相乘,看结果是否大于1,当然,我们必须测试图中的每一个节点.

       本题的数据输入很失一般性,在这个过程中就能学不少的东西.将货币名称转换为数字

      下面是测试数据图解:

《poj 2240-Arbitrage Bellman-ford算法》

《poj 2240-Arbitrage Bellman-ford算法》

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define maxn 50 //顶点数最大值
#define maxm 1000//边数最大值
/*汇率关系数组*/
struct exchange
{
	int ci,cj;
	double  cij;
}ex[maxm];
int i,j,k;
int n,m;//货币种类,汇率的数目
char name[maxn][20],a[20],b[20];//货币名称
double x;//读入的汇率
double maxdist[maxn];//从原点i到其他每个顶点(包括它本身)的最长路径长度
int flag;
int kcase=0;
int read()
{
	scanf("%d",&n);
	if(n==0) return 0;
	for(i=0;i<n;i++)
	{
		scanf("%s",name[i]);//you must rember the method

	}
	scanf("%d",&m);

	/*读取数据,将名字改写为顶点*/
	for(i=0;i<m;i++)
	{
		scanf("%s %lf %s",a,&x,b);
		for(j=0;strcmp(a,name[j]);j++)//when a<name return <0,equal 
		                             //return 0;
					;
		for(k=0;strcmp(b,name[k]);k++)
			;
		ex[i].ci=j;ex[i].cij=x;ex[i].cj=k;
	}
	return 1;

}
void bellman(int v0)
{
	flag=0;
	memset(maxdist,0,sizeof(maxdist));
	maxdist[v0]=1;
	for(k=1;k<=n;k++)
	{
		for(i=0;i<m;i++)
		{
			if(maxdist[ex[i].ci]*ex[i].cij>maxdist[ex[i].cj])//include itsel
				maxdist[ex[i].cj]=maxdist[ex[i].ci]*ex[i].cij;
		}
	}
	if(maxdist[v0]>1.0)
		flag=1;
}
int main()
{
	//freopen("in.txt","r",stdin);
	while(read())
	{
		for(i=0;i<n;i++)
		{
			bellman(i);
			if(flag)
				break;

		}
		if(flag)
			printf("Case %d: Yes\n",++kcase);
		else
			printf("Case %d: No\n",++kcase);

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