您的位置:首页 > 其它

POJ - 2240 Arbitrage(Floyd)

2016-05-01 23:14 381 查看
题目链接:http://poj.org/problem?id=2240

#include <iostream>
#include <cstring>
#include <string>
#include <map>
using namespace std;
/****************************************************************************************************************
题意:给定 N 种货币以及货币之间的汇率,问是否通过兑换可以赚钱
思路:
1,利用floyd求每两个点最短路的思想,更新每两种货币之间兑换情况
2,当 Map[i][i] > 1,即通过兑换之后货币本身之间的兑换率 > 1,那么就是赚钱了
3,更新时注意汇率是乘运算,不是加运算
4,最后遍历每种货币,有赚钱情况输出Yes,否则输出No.
****************************************************************************************************************/
double Map[35][35];
map <string ,int> name;
int main()
{
int m,n;
int num=1;
while(cin>>n,n!=0)
{
name.clear();
memset(Map,0,sizeof(Map));
for(int i = 1;i <= n;i ++)
Map[i][i]=1;

string s;
for(int i = 1;i <= n;i ++){
cin>>s;
name[s]=i;
}
cin>>m;
string s1,s2;
double rate;
while(m--)
{
cin>>s1>>rate>>s2;
Map[name[s1]][name[s2]]=rate;
}

for(int k = 1;k <= n;k ++)
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= n;j ++)
if(Map[i][k] && Map[i][j] < Map[i][k]*Map[k][j])
Map[i][j]=Map[i][k]*Map[k][j];

int flag=0;
for(int i = 1;i <= n;i ++){ //遍历所有货币情况
if(Map[i][i] > 1){
flag=1;
break;
}
}
if(flag)
cout<<"Case "<<num++<<": Yes"<<endl;
else
cout<<"Case "<<num++<<": No"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: