poj 2240 Arbitrage

来源:互联网 发布:服务器机柜和网络机柜 编辑:程序博客网 时间:2024/06/08 07:00

套汇。不同的货币有不同的货币转换规则,给出你一些货币的转换比例,问你是否存在套汇现象。

解法:传递闭包用floyd。初始的汇率比例为1,floyd完了之后看有没有大于1的,如果有则存在套汇。

#include<iostream>#include<cstdio>#include<cstring>#include<map>#include<string>using namespace std;double arry[50][50];int kcase = 0;int n;void floyd(){    for(int k = 0 ; k < n ; k++)    {        for(int i = 0 ; i < n ; i++)        {            for(int j = 0 ; j < n ; j++)            {                if(arry[i][j]  < arry[i][k] * arry[k][j])                {                    arry[i][j] = arry[i][k]*arry[k][j];                }            }        }    }    bool flag = false;    for(int i  = 0 ; i < n ; i++)    {        if(arry[i][i] > 1.0 )        {            flag = true;            break;        }    }    if(flag)    {        printf("Case %d: Yes\n",++kcase);    }    else    {        printf("Case %d: No\n",++kcase);    }}int main(){    while(scanf("%d",&n) && n)    {        memset(arry,0,sizeof(arry));        map<string,int>List;        string s1,s2;        for(int i = 0 ; i < n ; i++)        {            cin>>s1;            List[s1] = i;            arry[i][i] = 1.0;        }        int m;        scanf("%d",&m);        double f;        for(int i = 0 ; i < m ; i++)        {            cin>>s1>>f>>s2;            int a = List[s1];            int b = List[s2];            arry[a][b] = f;        }        floyd();    }    return 0;}


0 0