题意:给你一些比赛情况,看能否产生冠军
思路:拓扑排序,给每个字符串编一个号,然后就是建图,只要找到入度为0的点并且只有一个那就能产生冠军,否则不行
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
char str[2005][100];
int num[2005];
int s_count = 0;
int find(char *s)
{
int i,len = strlen(s);
for(i = 0; i < s_count; i++)
{
if(strcmp(s,str[i]) == 0)
return i;
}
strcpy(str[s_count],s);
return s_count++;
}
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
int i;
if(n == 0)
break;
char s1[100],s2[100];
s_count = 0;
memset(num,0,sizeof(num));
for(i = 0; i < n; i++)
{
scanf("%s%s",s1,s2);
find(s1);
int t = find(s2);
num[t]++;
}
int sum = 0;
for(i = 0; i < s_count; i++)
{
if(!num[i])
sum++;
}
if(sum == 1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}