标签:
Description
Input
Output
Sample Input
3 2 1 20.0 1 2 1.00 1.00 1.00 1.00 2 3 1.10 1.00 1.10 1.00
Sample Output
YES
题目大意:有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费是0.39,那么你可以得到(100 - 0.39) * 29.75 = 2963.3975 B币。问s币的金额经过交换最终得到的s币金额数能否增加。
货币的交换是可以重复多次的,所以我们需要找出是否存在正权回路,且最后得到的s金额是增加的。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 using namespace std; 6 const int maxn=250; 7 struct node 8 { 9 int a; //货币a 10 int b; //货币b 11 double rate; 12 double com;//手续费 13 }path[maxn]; 14 int n; //货币种数 15 int m; //兑换点数量 16 int s; //第几种货币 17 double v; //持有s种货币的本金 18 int index; 19 double val[maxn]; //s到各边的权值 20 bool bellman() 21 { 22 bool flag; 23 memset(val,0,sizeof(val)); 24 val[s]=v; 25 for(int i=1;i<=n;i++) 26 { 27 flag=false; 28 for(int j=1;j<index;j++) 29 { 30 if(val[path[j].b]<(val[path[j].a]-path[j].com)*path[j].rate) 31 { 32 val[path[j].b]=(val[path[j].a]-path[j].com)*path[j].rate; 33 flag=true; 34 } 35 } 36 if(!flag) 37 break; 38 } 39 return flag; 40 } 41 int main() 42 { 43 int a,b; 44 double a1,a2,b1,b2; 45 scanf("%d%d%d%lf",&n,&m,&s,&v); 46 index=1; 47 for(int i=1;i<=m;i++) 48 { 49 scanf("%d%d%lf%lf%lf%lf",&a,&b,&a1,&b1,&a2,&b2); 50 path[index].a=a,path[index].b=b; 51 path[index].rate=a1,path[index].com=b1; 52 index++; 53 path[index].a=a,path[index].b=b; 54 path[index].rate=a2,path[index].com=b2; 55 index++; 56 } 57 if(bellman()) 58 printf("YES\n"); 59 else 60 printf("NO\n"); 61 return 0; 62 }
标签:
原文地址:http://www.cnblogs.com/cxbky/p/4904601.html