http://acm.hdu.edu.cn/showproblem.php?pid=2094
两种方法做,一种是STL的map容器,因为如果有冠军,那么一定只有一个人是没有输过的,那么只要输入的时候,把输的人标记为无穷大,然后统计小于无穷大的人有多少个,恰好为1就代表有冠军。
#include<cstdio>
#include<iostream>
#include<map>
#include<string>
#define inf 1000000
using namespace std;
int main()
{
int n;
map<string,int>m;
map<string,int>::iterator it;
string a,b;
while(scanf("%d",&n)!=EOF&&n)
{
m.clear();
while(n--)
{
cin>>a>>b;
m[a]++;
m[b]=inf;
}
int ans=0;
for(it=m.begin();it!=m.end();it++)
{
if(it->second<inf) ans++;
}
if(ans==1) printf("Yes\n");
else printf("No\n");
}
return 0;
}
第二种是统计入度为0的点是否只有一个,其实原理是一样,上面只是简化了实现。
注意是人数要统计出来。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#define N 1001
using namespace std;
int in[N];
string s[N];
int main()
{
int n,k,i;
string a,b;
while(scanf("%d",&n)!=EOF&&n)
{
memset(in,0,sizeof(in));
for(i=0;i<N;i++)
s[i].clear();
k=1;
while(n--)
{
cin>>a>>b;
for(i=1;i<k;i++)
if(s[i]==a) break;
if(i==k)
{
s[k++]=a;
}
for(i=1;i<k;i++)
if(s[i]==b) break;
if(i==k)
{
s[k]=b;
in[k]++;
k++;
}
else
{ //已经有这个人了,所以只要入度加加就行。
in[i]++;
}
}
int ans=0;
for(i=1;i<k;i++)
{
if(in[i]==0) ans++;
}
if(ans==1) printf("Yes\n");
else printf("No\n");
}
return 0;
}