思路一:产生冠军的条件:(1)获胜的人没输过一次(2)最终获胜的人只有一个
思路二:观察一下,可以看到其实只要总元素数-失败者==1就可以输出YES了。。
思路三:左边的为胜利者,右边的为失败者,如果左边的胜利者只有一个没在右边出现过,那么这个就是产生的冠军,否则产生不了。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 1005
struct P
{
char winer[100];
char loser[100];
int point;
}a[N];
int main ()
{
// freopen("E:\input.txt", "r", stdin);
int n, i;
int c[1010];
while ((scanf("%d", &n)) && n)
{
memset(a, 0, sizeof(a));
//char t2[100];
for (i = 0; i < n; i++)
{
scanf("%s %s", a[i].winer, a[i].loser);
a[i].point = 1;
}
char temp[1005][100];
int k = 0;
for (i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (strcmp(a[i].winer, a[j].loser) == 0)
{
a[i].point = 0;
//strcpy(temp[k++], a[i].winer);
}
}
}
//strcpy(temp[k], temp[k - 1]);
for (i = 0; i < n; i++)
{
if (a[i].point == 1)
{
strcpy(temp[k++], a[i].winer);
}
}
//strcpy(temp[k], temp[k - 1]);
int sum = 0;
for (i = 1; i < k; i++)
{
if (strcmp(temp[i], temp[i - 1]) == 0)
{
sum++;
}
}
if (sum == k - 1)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return 0;
}