这个题也是十分水的题,节点最多只有30个。
Floyd就可以过的哈。
需要注意的是:
1、不要用gets(),因为中间有空行;
2、注意输出的是Yes,No。
下面是代码:
#include <stdio.h>
#include <string.h>
const int inf=1<<30;
const int V=105;
int n;
double map1[V][V];
char s[35][200];
int find1()
{
char s1[200];
scanf("%s",s1);
for(int i=0; i<n; i++)
{
if(strcmp(s[i],s1)==0)
{
return i;
}
}
}
void flody(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(map1[i][j]<map1[i][k]*map1[k][j])
{
map1[i][j]=map1[i][k]*map1[k][j];
}
}
}
}
}
int main()
{
int in=1;
while(scanf("%d",&n),n)
{
int i,j,t,a,b,flat=0;
double d;
for(i=0; i<n; i++)
{
scanf("%s",s[i]);
}
scanf("%d",&t);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
map1[i][j]=1.0;
}
}
for(i=0; i<t; i++)
{
a=find1();
scanf("%lf",&d);
b=find1();
map1[a][b]=d;
}
flody(n);
for(i=0;i<n;i++)
{
if(map1[i][i]>1.0) //判断条件
{
flat=1;
}
}
if(flat)
{
printf("Case %d: Yes\n",in);
}
else
{
printf("Case %d: No\n",in);
}
in++;
}
return 0;
}