题目链接:http://poj.org/problem?id=2240
大意:给出n种货币和n种货币之间的汇率,问存不存在套汇;
思路:最短路的变形,求出是否存在最大环使得换路径大于1即可;
#include<iostream>
#include<cstring>
using namespace std;
const int inf=100000;
double dist[1000][1000];
char name[1000][50];
int n,m;
void floyd()
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(dist[i][j]<dist[i][k]*dist[k][j])
dist[i][j]=dist[i][k]*dist[k][j];
}
}
}
return;
}
int main()
{
int cases=1;
for(;;)
{
scanf("%d",&n);
if(!n) break;
memset(dist,0,sizeof(dist));
int i,j,k;
for(i=1;i<=n;i++)
{
dist[i][i]=1;
scanf("%s",name[i]);
}
scanf("%d",&m);
for(i=1;i<=m;i++)
{
char c1[50],c2[50];
double r;
scanf("%s %lf %s",c1,&r,c2);
/*取输入货币名称在name数组中的位置*/
for(j=1;strcmp(c1,name[j]);j++)
;
for(k=1;strcmp(c2,name[k]);k++)
;
dist[j][k]=r;
}
/*floyd*/
floyd();
bool flag=false;
for(i=1;i<=n;i++)
{
if(dist[i][i]>1.0)
flag=true;
}
if(flag)
printf("Case %d: Yes\n",cases++);
else
printf("Case %d: No\n",cases++);
}
return 0;
}