POJ 2240 Arbitrage

这一题是一道比较好的最短路的变型题,大致思路是求得本身到本身的最短路,注意这一题路与路是相乘的关系,用floy的算法即可。

AC code:

View Code
 1 #include <iostream>
 2 #include <string>
 3 #include <map>
 4 #define INF 10000
 5 using namespace std;
 6 
 7 int n, m; //货币种类与兑换方式
 8 
 9 map<string, int> v; //利用c++提供的模板库来为数据读入带来方便
10 
11 double dis[100][100];
12 char str[50], str1[50], str2[50];
13 
14 void init()
15 {
16     double rate;
17     //initial
18     for (int i = 0; i < 100; i++)
19     {
20         for (int j = 0; j < 100; j++)
21         {
22             dis[i][j] = INF;
23         }
24     }
25     //初始化时将自己到本身的兑换值默认为1
26     for (int i = 1; i <= n; i++)
27     {
28         cin >> str;
29         v[str] = i;
30         dis[i][i] = 1;
31     }
32     scanf("%d", &m);
33     //利用c++模板库让英文名字跟序号对应起来
34     for (int i = 0; i < m; i++)
35     {
36         cin >> str1 >> rate >> str2;
37         dis[v[str1]][v[str2]] = rate;
38     }
39 }
40 void floyd()
41 {
42     for (int k = 1; k <= n; k++)
43     {
44         for (int i = 1; i <= n ; i++)
45         {
46             for (int j = 1 ; j <= n; j++)
47             {
48                    if(dis[i][j] < dis[i][k] * dis[k][j])
49                        dis[i][j] = dis[i][k] * dis[k][j];
50             }
51         }
52     }
53 }
54 int main()
55 {
56     int number = 1;
57     while(scanf("%d", &n) != EOF && n)
58     {
59 
60            init();
61            floyd();
62            int flag = false;
63            //一旦找出一个盈利的即可输出
64            for (int i = 1; i <= n; i++)
65            {
66                 if(dis[i][i] > 1)
67                     flag = true;
68                 break;
69            }
70            if(flag)
71                cout << "Case " << number << ": Yes"<<endl;
72            else
73                cout << "Case " << number << ": No" <<endl;
74            number++;
75     }
76     return 0;
77 }
posted @ 2012-04-13 20:17  背着超人飞  阅读(212)  评论(0)    收藏  举报