题目大意:一个城市里有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;
}