题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217
题解:Floyd求自己到自己的距离大于1
#include <stdio.h>
#include <string.h>
#define MAXN 32
double mp[MAXN][MAXN];
int visited[MAXN];
char money[MAXN][MAXN];
int check(char *str)
{
int i;
for(i=0;i<MAXN;++i)
if(!strcmp(money[i],str))
return i;
}
void Floyd(int n)
{
int i,j,k;
for(k=0;k<n;++k)
{
for(i=0;i<n;++i)
for(j=0;j<n;++j)
if(mp[i][j]<mp[i][k]*mp[k][j])
mp[i][j]=mp[i][k]*mp[k][j];
}
}
int main()
{
int x,n,m,i,j,flag,cases=1;
char start[MAXN],end[MAXN];
double rate;
while(scanf("%d",&n)&&n)
{
flag=0;
memset(mp,0,sizeof(mp));
for(i=0;i<n;++i)
scanf("%s",money[i]);
scanf("%d",&m);
for(x=0;x<m;++x)
{
scanf("%s %lf %s",start,&rate,end);
i=check(start);
j=check(end);
mp[i][j]=rate;
}
Floyd(n);
for(i=0;i<n;++i)
{
if(mp[i][i]>1)
flag=1;
}
if(flag)
printf("Case %d: Yes\n",cases++);
else
printf("Case %d: No\n",cases++);
}
return 0;
}