hdu 1217 Arbitrage(floyd,存在递增的环)

                                                Arbitrage

                                                           Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
                                                                                          Total Submission(s): 9421    Accepted Submission(s): 4341


Problem Description
Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currency. For example, suppose that 1 US Dollar buys 0.5 British pound, 1 British pound buys 10.0 French francs, and 1 French franc buys 0.21 US dollar. Then, by converting currencies, a clever trader can start with 1 US dollar and buy 0.5 * 10.0 * 0.21 = 1.05 US dollars, making a profit of 5 percent.

Your job is to write a program that takes a list of currency exchange rates as input and then determines whether arbitrage is possible or not.
 

Input
The input file will contain one or more test cases. Om the first line of each test case there is an integer n (1<=n<=30), representing the number of different currencies. The next n lines each contain the name of one currency. Within a name no spaces will appear. The next line contains one integer m, representing the length of the table to follow. The last m lines each contain the name ci of a source currency, a real number rij which represents the exchange rate from ci to cj and a name cj of the destination currency. Exchanges which do not appear in the table are impossible.
Test cases are separated from each other by a blank line. Input is terminated by a value of zero (0) for n.
 

Output
For each test case, print one line telling whether arbitrage is possible or not in the format "Case case: Yes" respectively "Case case: No".
 

Sample Input
 
  
3 USDollar BritishPound FrenchFranc 3 USDollar 0.5 BritishPound BritishPound 10.0 FrenchFranc FrenchFranc 0.21 USDollar 3 USDollar BritishPound FrenchFranc 6 USDollar 0.5 BritishPound USDollar 4.9 FrenchFranc BritishPound 10.0 FrenchFranc BritishPound 1.99 USDollar FrenchFranc 0.09 BritishPound FrenchFranc 0.19 USDollar 0
 

Sample Output
 
  
Case 1: Yes Case 2: No
 
//理解:对于每个币种我们初始化他们自己和自己交换的汇率是1,那么通过floyd算法后,这样我就不断的更新了任意两点之间的汇率,同时也包括自己和自己的汇率,
//当存在自己跟自己交换的汇率大一1那么说明图中存在一条回路(回路的起点和终点都是当前这个自己汇率大于1的点),这条回路你拿钱交换一遍后,自己的钱多了。
#include <iostream>
#include <stdio.h>
#include <queue>
#include <algorithm>
#include <string.h>
#include <vector>
#include <cmath>
#include <map>
#define maxn 35
#define INF 0x3f3f3f3f
using namespace std;
double G[maxn][maxn];  //G[i][j]表示i币种到j的汇率;
int n, m;  //点数和边数;

void floyd(){
    for(int k = 1; k <= n; k++){
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= n; j++){
                if(G[i][j] < G[i][k]*G[k][j])
                   G[i][j] = G[i][k]*G[k][j]; //这里要特别注意,我们对于每种货币i,j之间加入一种货币k,如果让i交换到k,再让k交换到j;
            }                                  //这种交换方式要比i,j之间直接交换的利率高;
        }
    }
    return;
}
int main(){
    map<string,int > p;
    string str;
    string str1;
    int cnt = 1;
    double rat;
    while(scanf("%d", &n) != EOF && n){
        for(int i = 1; i <= n; i++){
            cin>>str;
            p[str] = i;
            //p.insert(make_pair(str, i));
        }
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= n; j++){
                if(i == j)
                    G[i][j] = 1.0;  //自己币种之间的兑换率为1;
                else
                    G[i][j] = 0;   //其他币种之间的兑换率初始化为0;
            }
        }
        cin >> m;
        for(int i = 1; i <= m; i++){
            cin>>str;
            cin>>rat;
            cin>>str1;
            int k = p[str];
            int l = p[str1];
            G[k][l] = rat;
        }
        floyd();
        printf("Case %d: ", cnt++);
        int i;
        for(i = 1; i <= n; i++){
            if(G[i][i] > 1.0){//通过更新得到的G[i][i],自己和自己交换的概率大于1,那么这条路中不就是存在一条路我可以交换一直盈利吗!
                printf("Yes\n");
                break;
            }
        }
        if(i > n)
            printf("No\n");

    }
    return 0;
}

 

猜你喜欢

转载自blog.csdn.net/guihaiyuan123/article/details/80159557
今日推荐