hdu 1217 Arbitrage--Floyd

/*
	千万要注意输出“Yes”和“No”的时候是首字母大写还是全大写
	注意变量初始化
*/
#include<stdio.h>
#include<string.h>
double map[35][35],hui;
char s[35][150],nam[150],nam1[150];
int n,m,f,num=1,nnum;
#define Max(a,b) (a)>(b)?(a):(b)
void floyd()
{
	int i,j,k;
	for(k=1;k<=n;k++)
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
			{
				map[i][j]=Max(map[i][k]*map[k][j],map[i][j]);
			}
	double max=0;
	for(i=1;i<=n;i++)
		if(map[i][i]>max)
			max=map[i][i];
	if(max>1)
		printf("Yes\n");
	else printf("No\n");
}
int name(char nn[])
{
	int i;
	for(i=1;i<nnum;i++)
		if(strcmp(nn,s[i])==0)
			return i;
	strcpy(s[nnum],nn);
	nnum++;
	return nnum-1;
}
int main()
{
	int i,j;
	while(scanf("%d",&n),n)
	{
		nnum=1;
		f=0;
		memset(map,0,sizeof(map));
		getchar();
		for(i=1;i<=n;i++)
		{
			gets(nam);
			name(nam);
		}
		scanf("%d",&m);
		getchar();
		for(i=1;i<=m;i++)
		{
			int n0,n1;
			scanf("%s %lf %s",nam,&hui,nam1);
			n0=name(nam);
			n1=name(nam1);
			map[n0][n1]=hui;
			if(n0==n1&&hui>1)
				f=1;
		}
		printf("Case %d: ",num++);
		if(f==1)
			printf("Yes\n");
		else
			floyd();
	}
	return 0;
}

 

你可能感兴趣的:(hdu 1217 Arbitrage--Floyd)