POJ 1860 Currency Exchange(Bellman-Ford)

来源:互联网 发布:java全栈开发 编辑:程序博客网 时间:2024/04/29 11:07
题意 : 有关汇率的问题,汇率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;}


0 0
原创粉丝点击