标签:rate 货币 not false tis eth term mina ext
3 USDollar BritishPound FrenchFranc 3 USDollar 0.5 BritishPound BritishPound 10.0 FrenchFranc FrenchFranc 0.21 USDollar 3 USDollar BritishPound FrenchFranc 6 USDollar 0.5 BritishPound USDollar 4.9 FrenchFranc BritishPound 10.0 FrenchFranc BritishPound 1.99 USDollar FrenchFranc 0.09 BritishPound FrenchFranc 0.19 USDollar 0Sample Output
Case 1: Yes Case 2: No
题意:先给 货币的种类 数量n 种, 然后给出 n 种货币的名字 , 再给出 转换方式的数量 m , 之后 m 种 具体的 货币转换关系 。
某一种转换关系 a b c , 表示 货币 a 乘以 比例 b 为可以 换到的 货币 c 的数量 。
问是否存在正环。存在输出 Yes 否则输出 No
思路: 数组存放 n 种货币名称 , 数组下标 表示 给货币 编号 。
然后给其中一种货币的本金置为 1 ,其他为 0 , 然后用 bellman_ford 算法判断正环。
1.bellman_ford()
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std ; #define maxn 1000 char str[maxn][maxn] ; double dis[maxn] ; struct node { int a , b ; double rate ; }; node edge[maxn] ; int n , m ; // 获得 货币 s 在 数组中的编号 int getpos(char *s){ for(int i=1 ; i<=n ; i++){ if(strcmp(str[i] , s ) == 0 ){ return i ; } } } // 输入 && 建边 void init(){ char a[maxn] , c[maxn] ; double b ; for(int i=1 ; i<=n ; i++){ scanf(" %s" , str[i]) ; } scanf("%d" , &m) ; for(int i=1 ; i<=m ; i++){ scanf("%s %lf %s" , a , &b , c ) ; edge[i].a = getpos(a) ; edge[i].b = getpos(c) ; edge[i].rate = b ; } } // 判断正环 bool bellman_ford(){ for(int i=1 ; i<=n ; i++){ dis[i] = 0 ; } dis[1] =1 ; for(int i=1 ; i<=n ; i++){ for(int j=1 ; j<=m ; j++){ if(dis[edge[j].a] * edge[j].rate > dis[edge[j].b]){ dis[edge[j].b] = dis[edge[j].a] * edge[j].rate ; } } } for(int i=1 ; i<= m ;i++){ if(dis[edge[i].a] * edge[i].rate > dis[edge[i].b]){ return true ; } } return false ; } int main(){ int times = 0 ; while(~scanf("%d" , &n) && n ){ init() ; printf("Case %d: " , ++ times) ; if(bellman_ford()){ printf("Yes\n") ; } else { printf("No\n") ; } } return 0 ; }
2.floyd()
#include <iostream> #include <string.h> using namespace std; #define MAXC 100 #define MAXV 50 double map[MAXV][MAXV]; int n,m; void Input(){ char s[MAXV][MAXC],a[MAXC],b[MAXC]; int i,k,j; double c; for(i=0;i<=n;i++) for(j=0;j<=n;j++) if(i==j) map[i][j]=1; else map[i][i]=0; for(i=1;i<=n;i++) scanf("%s",s[i]); scanf("%d\n",&m); for(i=1;i<=m;i++){ scanf("%s %lf %s",a,&c,b); for(j=1;j<=n;j++) if(!strcmp(s[j],a)) break; for(k=1;k<=n;k++) if(!strcmp(s[k],b)) break; map[j][k]=c; } } void floyd(){ int i,j,k; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(map[i][k]*map[k][j]>map[i][j]) map[i][j]=map[i][k]*map[k][j]; } int main(){ int cas=1,i; while(scanf("%d\n",&n) && n){ Input(); floyd(); printf("Case %d: ",cas++); for(i=1;i<=n;i++) if(map[i][i]>1) break; if(i>n) printf("No\n"); else printf("Yes\n"); } return 0; }
kuangbin专题四 : 最短路 I 题 Arbitrage
标签:rate 货币 not false tis eth term mina ext
原文地址:http://www.cnblogs.com/yi-ye-zhi-qiu/p/7795896.html