题目大意:有n种货币,有m家交易点,每个交易点只支持一种货币兑换另一种货币。问是否能够通过兑换货币变得更富有。
解题思路:与POJ1860是类似的,用bellman_ford算法,交易只能单向交易,初始化其中某种货币为1,要更富有,松弛往大松弛。经过n次的松弛操作,如果还能继续松弛说明可以变得更富有。
ac代码:
#include <iostream>
#include <map>
#include <string>
#include <cstring>
using namespace std;
map <string, int>ma;
int n, m, u[1005], v[1005], kk, ll, cnt=1, flag;
double ratio, w[1005], dis[35];
char bank[1005], t1[1005], t2[1005];
int main()
{
while (scanf("%d", &n)!=EOF && n){
memset(dis, 0, sizeof(dis));
getchar();
for (int i=1; i<=n; i++){
scanf("%s", bank);
ma[bank] = i;
}
dis[1] = 1;
flag = 0;
scanf("%d", &m);
getchar();
for (int i=0; i<m; i++){
scanf("%s%lf%s", t1, &ratio, t2);
u[i] = ma[t1], v[i] = ma[t2];
w[i] = ratio;
}
dis[1] = 1;
for (int i=1; i<n; i++)
for (int j=0; j<m; j++){
kk = u[j], ll = v[j];
if (dis[ll] < dis[kk] * w[j])
dis[ll] = dis[kk] * w[j];
}
for (int j=0; j<m; j++){
kk = u[j], ll = v[j];
if (dis[ll] < dis[kk] * w[j])
flag = 1;
}
if (flag)
printf("Case %d: Yes\n", cnt++);
else
printf("Case %d: No\n", cnt++);
ma.clear();
}
return 0;
}