POJ2240 Arbitrage(最短路)

题目链接

题意:

根据汇率可以将一种金币换成其他的金币,求最后能否赚到比原来更多的金币。

分析:

最短路的求法,用floyd.

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>

using namespace std;

const int maxn = 100;

map<string, int> a;
double G[maxn][maxn];
int cn ;

int main() {
    int n, m, u, v, cnt = 0;
    char s[1000], s1[1000], s2[1000];
    double rate;

    while(cin >> n) {
        if(n == 0) break;

        a.clear(); cn = 0;

        for(int i=0; i<n; i++) {
                for(int j=0; j<n; j++) {
                G[i][j] = 1.0;
            }
        }

        for(int i=0; i<n; i++) {
            scanf("%s", s);
            if(a.count(s) == 0) a[s] = cn++;
        }

        cin >> m;
        for(int i=0; i<m; i++) {
            cin >> s1 >> rate >> s2;
            if(a.count(s1) == 1) u = a[s1];
            else continue;

            if(a.count(s2) == 1) v = a[s2];
            else continue;
            G[u][v] = rate;
        }

        for(int k=0; k<n; k++) {
            for(int i=0; i<n; i++) {
                for(int j=0; j<n; j++) {
                    G[i][j] = max(G[i][j], G[i][k]*G[k][j]);
                }
            }
        }

        bool flag = false;
        for(int i=0; i<n; i++) {
                if(G[i][i] > 1.0) {
                flag = true;
                break;
            }
        }

        if(flag) printf("Case %d: Yes\n", ++cnt);
        else printf("Case %d: No\n", ++cnt);
    }

    return 0;
}

 

 

posted on 2013-07-03 13:37  Still_Raining  阅读(202)  评论(0编辑  收藏  举报