POJ 1860

来源:互联网 发布:为什么淘宝网打不开 编辑:程序博客网 时间:2024/05/21 14:04

题目大意:一个城市里有N种货币,编号从1~N,有M个货币交换点,每个交换点支持两种货币之间的交换,包括6个数据,第一种货币A,第二种货币B,A换成B的汇率,A换成B的佣金,B换成A的汇率,B换成A的佣金。一个人有V单位的编号为S的货币。问他是否能够通过交换点,使得自身的货币增多。交换点规则如下:A->B汇率为29.75,佣金为0.37。有100单位的A货币,则换成B有 (100 - 0.39) * 29.75 = 2963.3975单位

解题思路:用bellman ford算法,初始货币为exch[S] = V,不过是往大进行松弛操作,所以初始为0,如果进过N-1次循环还可以松弛,说明可以通过交换点使得货币增多。

ac代码:

#include <iostream>#include <cmath>#include <cstring>using namespace std;int N, M, S, u[105], v[105], t1, t2, flag;double V, exch[105], w1[105], com1[105], w2[105], com2[105];int main(){while (scanf("%d%d%d%lf", &N, &M, &S, &V)!=EOF){memset(exch, 0, sizeof(exch));flag = 0;exch[S] = V;for (int i=0; i<M; i++)scanf("%d%d%lf%lf%lf%lf", &u[i], &v[i], &w1[i], &com1[i], &w2[i], &com2[i]);for (int i=1; i<N; i++)for (int j=0; j<M; j++){t1 = u[j], t2 = v[j];exch[t2] = max(exch[t2], (exch[t1]-com1[j])*w1[j]);exch[t1] = max(exch[t1], (exch[t2]-com2[j])*w2[j]);}for (int i=0; i<M; i++){t1 = u[i], t2 = v[i];if (exch[t2] < (exch[t1]-com1[i])*w1[i])flag = 1;if (exch[t1] < (exch[t2]-com2[i])*w2[i])flag = 1;}if (flag)printf("YES\n");elseprintf("NO\n");}return 0;}
原创粉丝点击