您的位置:首页 > 其它

poj 1860 Currency Exchange (Bellman_ford 算法)

2014-03-06 20:56 288 查看
题目连接:点击打开链接

翻译题目:

城市里有几个货币兑换点,让我们假设每个点是给给两种特定的货币的进行相互兑换的操作,每个兑换点都有其自己的兑换率,且A到B的兑换率等同于B到A的兑换率。同样每个兑换点也需要一些操作费。

例如,如果你想兑换100us dollar到俄罗斯卢比,交换律就是29.75,小费就是0.39,所以最终你得到的卢比就是 (100 - 0.39) * 29.75 = 2963.3975RUR

现在在这个城市里有N种不同的货币可以供你兑换,现在假设每种货币的编号就是从1到N,然后对于每个兑换点用6个整数描述:A和B表示需要兑换的两种货币的编号,RAB, CAB, RBA and CBA表示兑换率和“小费”的多少

Nick有一些S货币,他想在进行一些钱币兑换后,增加他的资本,最后还得是兑换成最开始S货币。

输入:

(货币的种类)(兑换点的多少)(Nick持有的是何种货币)(该货币他持有多少)

接下来是每个兑换点的六个描述

输出:

若资本增加,YES; 资本减少,NO。

 这道题利用的就是Bellman_ford算法的变形,说是变形其实也是根据题意稍稍做了下变动而已,利用Bellman_ford的思想求了一个最大路径,最后在判断是否存在正权回路,一下是AC代码,因为这几天一直在脸bellman的题目,代码
4000
大体敲出来都一样,随手一个  int dis[MAX]   就导致题目W了不知多少次。

代码如下:

#include <iostream>
#include <string.h>
using namespace std;

struct Edge
{
int a, b;
double c, r;
};

Edge edge[500];
int N, M, S;
double V;
double dis[500];

int Bellman_ford()
{
int i, j;
for(i=1; i<=N; i++)
dis[i] = 0;
dis[S] = V;
for(i=1; i<N; i++)
for(j=1; j<=2*M; j++)
{
if((dis[edge[j].a] - edge[j].c) * edge[j].r > dis[edge[j].b] && dis[edge[j].a] > 0)
{
dis[edge[j].b] = (dis[edge[j].a] - edge[j].c) * edge[j].r;
}
}
for(j=1; j<=2*M; j++)
if((dis[edge[j].a] - edge[j].c) * edge[j].r > dis[edge[j].b])
return 1;
return 0;
}

int main()
{
int i;
int a, b;
double c, r;
cin>>N>>M>>S>>V;
for(i=1; i<=M; i++)
{
cin>>a>>b>>r>>c;
edge[i].a = a;
edge[i].b = b;
edge[i].r = r;
edge[i].c = c;
cin>>r>>c;
edge[i+M].a = b;
edge[i+M].b = a;
edge[i+M].r = r;
edge[i+M].c = c;
}
if(Bellman_ford())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: