方法一:把所有人名列出来,从来没赢过的摔倒,赢过并且输过的摔掉。剩下的如果只有一个那就是冠军,如果不止一个就不是了。
简单优化:与其列出所有人名然后筛选出赢过的,还不如直接只给赢过的列表。那么我们需要两个表,一个放赢家(只要赢过都算),一个放输家(只要输过的就算)。接下来拿赢家中的每一个对象在输家中找,如果找到就可以摔掉了。最后剩下的就是超级大赢家了。当然,为了去重,我们选择使用STL容器中的set集合处理去重。
方法二:邻接表(统计结点入度为零的个数,唯一即可)
#include<stdio.h>
#include<string.h>
int top,cnt,flag;
struct Edge{
int n;// 入度
char s[10];
Edge *next;
Edge(int nn=0):n(nn){}
}*head[1010],e1[1010],e[1010];
void Addedge(char *s1,char *s2,int n){
flag=0;
Edge *p=&e[top+