HDU 1217--最短路
大致题意:货币兑换,n种货币,m种兑换关系,是否存在一种赚钱途径,有输出"Yes",没有则输出"No"。可能的赚钱方式是这样的:
假设有A,B,C三种货币,兑换关系是A 0.5 B,B 10.0 C,C 0.21 A。显然 0.5*10.0*0.21=1.05>1 可以赚钱。用少量的A可以换更多的A
。
思路:显然要找出每两种货币间的最大利率,然后判断货币i对其自身的利率是否大于一。
直接floyd就可以过。但是因为是乘法,需要注意dist初始化问题。。
View Code
1 #include<iostream> 2 #include<cstdio> 3 #include<map> 4 #include<string> 5 #include<cstring> 6 using namespace std; 7 double g[300][300]; 8 int main() 9 { 10 int n,cas=1,i,j,k,m; 11 string a,b,s; 12 double w; 13 while(scanf("%d",&n),n) 14 { 15 map<string,int> q; 16 for(i=1;i<=n;i++) 17 for(j=1;j<=n;j++) 18 g[i][j]=i==j?0:1; 19 for(i=1;i<=n;i++) 20 { 21 cin>>s; 22 q[s]=i; 23 } 24 cin>>m; 25 while(m--) 26 { 27 cin>>a>>w>>b; 28 g[q[a]][q[b]]=w; 29 } 30 for(k=1;k<=n;k++) 31 for(i=1;i<=n;i++) 32 for(j=1;j<=n;j++) 33 { 34 if(g[i][j]<g[i][k]*g[k][j]) 35 g[i][j]=g[i][k]*g[k][j]; 36 } 37 printf("Case %d: ",cas++); 38 if(g[1][1]>1) 39 puts("Yes"); 40 else 41 puts("No"); 42 } 43 return 0; 44 }
posted on 2013-02-04 20:18 acoderworld 阅读(70) 评论(0) 收藏 举报

浙公网安备 33010602011771号