题目大意
- 给出n种货币,以及m种对换方式的兑换率。求通过兑换能否使钱增加。
分析
- dis[i][j]表示货币i兑换货币j的最大兑换率。求出所有货币的之间的最大兑换率。最后查看dis[i][j] * dis[j][i] 是否大于1即可。
- 初始化dis[i][j] = (i == j ? 1 : 0);
- 直接使用Floyd算法即可
代码
#include <iostream>
#include <string>
#include <map>
using namespace std;
const int maxn = 35;
map<string , int> mp;
double dis[maxn][maxn];
void init(int n)
{
mp.clear();
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) dis[i][j] = (i == j ? 1 : 0);
}
int main()
{
int n , m , caseno = 1;
while(cin >> n && n)
{
init(n);
for(int i = 1; i <= n; i++) {
string s; cin >> s;
mp[s] = i;
}
cin >> m;
for(int i = 0; i < m; i++) {
string s1 , s2; double r;
cin >> s1 >> r >> s2;
dis[mp[s1]][mp[s2]] = r;
}
for(int k = 1; k <= n; k++) {
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(dis[i][j] < dis[i][k] * dis[k][j])
dis[i][j] = dis[i][k] * dis[k][j];
}
int flag = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++)
if(dis[i][j] * dis[j][i] > 1) {flag = 1; break;}
if(flag) break;
}
cout << "Case " << caseno++ << ": " << (flag ? "Yes" : "No") << endl;
}
return 0;
}