题目链接: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; }