这个题有一些小bug,比如你要决出冠军来,我如果1 是冠军,然后剩下的里面可以形成环。那么理论上这就不可以,不是很明白。下面的思路是先看一波一上来入度为0的点是不是一个,如果不是那么久直接gg,我觉得还应该判断环的问题,可是题目并木有。
#include <iostream>
#include <cstdio>
#include <cstring>
#include<malloc.h>
#include <map>
using namespace std;
#define MAX 510
int M,N;
char a[50],b[50];
int Map[MAX][MAX];//图
int res[MAX];//存放结果
int Out[MAX];
map<string,int> stoi;
bool Sort(){
int ans = 0 ;
//每次找一个,因为每次都有一个Break
for(int j = 1 ; j< N ; j ++)
{
if(Out[j]==0)
{
ans++;
if(ans>1)
return false ;
}
}
if(ans==0)
return false ;
return true ;
}
int main(){
while(~scanf("%d",&M))
{
if(M==0)
break ;
N = 1 ;
stoi.clear();
memset(Out,0,sizeof(Out));
memset(Map,0,sizeof(Map));
for(int i = 1 ; i <= M ;i++)
{
scanf("%s%s",&a,&b);
if(stoi[a]==0)
{
stoi[a]=N++;
}
if(stoi[b]==0)
{
stoi[b]=N++;
}
if(!Map[stoi[a]][stoi[b]])
{
Map[stoi[a]][stoi[b]]=1;
Out[stoi[b]]++;
}
}
if(Sort())
{
printf("Yes\n");
}else {
printf("No\n");
}
}
return 0 ;
}