题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2094
题 意:给你几个选手的比赛胜负,让你判断是否产生冠军。
思 路:按图的方式输入,找到入度为0的点的个数进行判断(及拓扑排序的应用)。
代码如下:
#include <iostream>
using namespace std;
#include <string.h>
#include <stdio.h>
#include <climits>
#include <algorithm>
#define maxn 65535
typedef __int64 LL;
char ben[1200][20];
int in[1200],si;
int findx( char s[20] )
{
int i;
for( i = 0; i < si; i ++ )
if( strcmp( ben[i], s ) == 0 ) break;
if( si == i ) strcpy(ben[si++],s);//若是没有出现过得选手则更新数组,把该选手加入
return i;
}
int main()
{
int n;
while( scanf ( "%d", &n ) != EOF )
{
if( n == 0 ) break;
memset( in, 0, sizeof( in ) );
si = 0;
for( int i = 0; i < n; i ++ )
{
char s1[20], s2[20];
scanf ( "%s %s", s1, s2 );
int p1 = findx(s1);//判断s1选手是否在里面
int p2 = findx(s2);//找到s2选手的位置,并将其的入度加1
in[p2]++;
}
int ans = 0;
for( int i = 0; i < si; i ++ )
{
if( in[i] == 0 ) ans++;
if( ans > 1 ) break;//这种情况代表有几位选手没有分出胜负
}
if( ans == 1 ) printf("Yes\n");
else printf("No\n");
}
return 0;
}