水题一枚。。。
ACcode:
#include<cstdio>
#include<cstring>
#include<map>
#include<iostream>
using namespace std;
const int nsize=222;
int n,k;
int e[nsize<<1],dp[5],c[5],v[nsize];
int next[nsize<<1],head[nsize],top;
map<string,int> name;
string s1,s2;
void add(int s,int p)
{
next[top]=head[p];
e[top]=s;
head[p]=top++;
}
int Max(int a1,int a2)
{
return a1>a2?a1:a2;
}
void dfs(int rt)
{
v[rt]=0;
int tp[5]={0,1},tc[5]={0};
for (int i=head[rt];i!=-1;i=next[i])
{
if (v[e[i]])
{
int s=e[i];
dfs(s);
tc[1]+=c[0];
tp[1]+=dp[0];
if (dp[0]>dp[1]) tp[0]+=dp[0],tc[0]+=c[0];
else if (dp[0]<dp[1]) tp[0]+=dp[1],tc[0]+=c[1];
else tp[0]+=dp[1],tc[0]++;
}
}
dp[1]=tp[1],dp[0]=tp[0];
c[1]=tc[1],c[0]=tc[0];
}
int main()
{
while (~scanf("%d",&n),n)
{
name.clear();
cin>>s1;
name[s1]=1;
top=0,k=2;
memset(v,1,sizeof(v));
memset(head,-1,sizeof(head));
for (int i=1;i<n;i++)
{
cin>>s1>>s2;
if (!name[s1]) name[s1]=k++;
if (!name[s2]) name[s2]=k++;
add(name[s1],name[s2]);
}
dfs(1);
int flag;
if (dp[1]>dp[0])
{
printf("%d ",dp[1]);
flag=c[1];
}
else if (dp[1]<dp[0])
{
printf("%d ",dp[0]);
flag=c[0];
}
else
{
printf("%d ",dp[0]);
flag=1;
}
if (flag) printf("No\n");
else printf("Yes\n");
}
return 0;
}