您的位置:首页 > 其它

POJ 1860 Currency Exchange(Bellman-Ford)

2014-04-10 20:05 411 查看
题意 : 有关汇率的问题,汇率rab,增加了一个手续费 cab 每次的结果是  (本金 - 手续费) * 汇率,而且一个人拥有的钱的类型是已知的,拥有的value 钱的个数也是已知的, 问你能不能增值。

思路: 在Bellonman原本的实现过程中,是寻找最短路,判断负环。这一题恰好相反,需寻找最长路,判断有无无限松弛的正环

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string.h>
using namespace std;

int n;
int m;
int s;
double v;

int sum;
double dis[110];

struct huilv
{
int a;
int b;
double r;
double c;
}hui[220];

int bellman()
{
memset(dis,0,sizeof(dis));
dis[s] = v;
int flag;
for(int i = 1;i < n; i++)
{
flag = 0;
for(int j = 0;j < sum; j++)
if(dis[hui[j].b] < (dis[hui[j].a] - hui[j].c) * hui[j].r)
{
dis[hui[j].b] = (dis[hui[j].a] - hui[j].c) * hui[j].r;
flag = 1;
}
if(!flag)
break;
}
for(int i = 0;i < sum; i++)
if(dis[hui[i].b] < (dis[hui[i].a] - hui[i].c) * hui[i].r)
return 1;
return 0;
}

int main()
{
int a,b;
double rab,cab,rba,cba;
while(cin>>n>>m>>s>>v)
{
sum = 0;
for(int i = 0;i < m;i++)
{
cin>>a>>b>>rab>>cab>>rba>>cba;
hui[sum].a = a;
hui[sum].b = b;
hui[sum].r = rab;
hui[sum++].c = cab;
hui[sum].a = b;
hui[sum].b = a;
hui[sum].r = rba;
hui[sum++].c = cba;
}
if(bellman())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: