uva 436(floyd变形)

题意:有若干种货币他们之间存在汇率,然后你要判断的是你能不能通过交换货币是你手中的一种货币不断的升值。

思路:floyd变形Map[i][j] = max(Map[i][j], Map[i][k]*Map[k][j]) 状态表示i交换到j最多能换多少。然后最后统计一下所有自己欢自己是不是有大于1就可以了。

代码如下:

uva 436(floyd变形)
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <cstring>
 6 #include <algorithm>
 7 #include <queue>
 8 #include <stack>
 9 #include <vector>
10 #include <set>
11 #include <map>
12 #define MP(a, b) make_pair(a, b)
13 #define PB(a) push_back(a)
14 
15 using namespace std;
16 
17 typedef long long ll;
18 typedef pair<int ,int> pii;
19 typedef pair<unsigned int, unsigned int> puu;
20 typedef pair<int ,double> pid;
21 typedef pair<ll, int> pli;
22 typedef pair<int, ll> pil;
23 
24 const int INF = 0x3f3f3f3f;
25 const double eps = 1e-6;
26 const int LEN = 110;
27 double Map[LEN][LEN];
28 int n, m;
29 string name[LEN];
30 map<string, int> mp;
31 
32 void floyd()
33 {
34     for(int k=0; k<n; k++){
35         for(int i=0; i<n; i++){
36             for(int j=0; j<n; j++){
37                 if(Map[i][j] < Map[i][k]*Map[k][j])
38                     Map[i][j] = Map[i][k] * Map[k][j];
39             }
40         }
41     }
42 }
43 
44 int main()
45 {
46 //    freopen("in.txt", "r", stdin);
47 
48     int kase = 1;
49     while(scanf("%d", &n)!=EOF && n){
50         for(int i=0; i<n; i++){
51             cin >> name[i];
52             mp[name[i]] = i;
53         }
54         scanf("%d", &m);
55         memset(Map, 0, sizeof Map);
56         double val;string a, b;
57         for(int i=0; i<m; i++){
58             cin >> a >> val >> b;
59             Map[mp[a]][mp[b]] = val;
60         }
61         floyd();
62         int ans = 0;
63         for(int i=0; i<n; i++){
64             if(Map[i][i]>1) ans = 1;
65         }
66         printf("Case %d: ", kase++);
67         if(ans)printf("Yes\n");
68         else printf("No\n");
69     }
70     return 0;
71 }
View Code

uva 436(floyd变形)

上一篇:实验1 8086汇编指令编码和调试


下一篇:AcWing1081 度的数量(数位dp)