紫书P282 9-13
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
#define FRER() freopen("in.txt","r",stdin)
#define FREW() freopen("out.txt","w",stdout)
#define go int T;cin>>T;while(T--)
#define debug cout<<"****************"<<endl
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
const int maxn = 100000 + 7,inf = 0x3f3f3f3f;
int n,tot;
map<string,int>id;
vector<int>son[maxn];
int dp[maxn][2];
bool f[maxn][2];
int dfs(int u,int k){
if(dp[u][k]) return dp[u][k];
//cout<<u<<endl;
if(son[u].empty()){
f[u][1] = f[u][0] = 1;
if(k==1) return dp[u][k] = 1;
else return dp[u][k] = 0;
}
int len = (int)son[u].size();
int &ans = dp[u][k];
if(k==1) ans++;
for(int i=0;i<len;i++){
int v = son[u][i];
if(k==1){
ans += dfs(v,0);
if(f[v][0]==0)
f[u][1]=0;
}else{
int sum1 = dfs(v, 1);
int sum2 = dfs(v, 0);
ans += max(sum1,sum2);
if(sum1==sum2) f[u][0] = 0;
else if(sum1>sum2){
if(f[v][1]==0) f[u][0] = 0;
}else {
if(f[v][0]==0) f[u][0] = 0;
}
}
}
return ans;
}
int main(){
//FRER();
//FREW();
while(cin>>n&&n){
id.clear();
memset(dp, 0, sizeof(dp));
memset(f, true, sizeof(f));
tot = 0;
string s1,s2;
cin>>s1;
id[s1] = ++tot;
for(int i=0;i<n-1;i++){
cin>>s1>>s2;
if(!id[s1]) id[s1]=++tot;
if(!id[s2]) id[s2]=++tot;
//cout<<id[s1]<<" "<<id[s2]<<endl;
son[id[s2]].push_back(id[s1]);
}
// for(int i=1;i<=tot;i++){
// cout<<son[i].size()<<endl;
// }
dfs(1,1);
dfs(1,0);
if(dp[1][0]>dp[1][1])
printf("%d %s\n",dp[1][0],f[1][0]?"Yes":"No");
else if(dp[1][0]<dp[1][1])
printf("%d %s\n",dp[1][1],f[1][1]?"Yes":"No");
else printf("%d No\n",dp[1][0]);
for(int i=0;i<=n;i++)son[i].clear();
}
}