您的位置:首页 > 其它

poj 2240-Arbitrage Bellman-ford算法

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

     --------------------------------------------------分割线---------------------------------------

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

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

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

      下面是测试数据图解:





#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj bellman-ford