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)    收藏  举报

导航