题目链接:http://poj.org/problem?id=2240
题意:有n种货币,有m种兑换方式,每种兑换方式有一定的汇率,问你有没有一种赚钱方法,能够换来换去赚钱的
解析:其实可以把所有的货币理解成一个个的结点,汇率,就是他们之间的一条单向边的权值,做边的松弛操作就相当于汇率相乘,现在题目问的就是问你经过各种松弛后是否有一个自环的汇率大于1的,只有30种货币,直接flyod就可以了
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
using namespace std;
map<string,int>maple;
double g[105][105];
int main(void)
{
int n,m,case_t = 1;
while(~scanf("%d",&n)&&n)
{
string a,b;
maple.clear();
for(int i=1;i<=n;i++)
{
cin>>a;
maple[a] = i;
}
scanf("%d",&m);
double p;
memset(g,1,sizeof(g));
for(int i=0;i<m;i++)
{
cin>>a>>p>>b;
g[maple[a]][maple[b]] = p;
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
g[i][j] = max(g[i][j],g[i][k]*g[k][j]);
}
}
int flag = 0;
for(int i=1;i<=n;i++)
{
if(g[i][i]>1)
{
flag = 1;
break;
}
}
printf("Case %d: ",case_t++);
if(flag) puts("Yes");
else puts("No");
}
return 0;
}