#include <iostream>
#include<string.h>
#include<stdio.h>
#include<string>
#include<stdlib.h>
#include<map>
#include<vector>
using namespace std;
#define maxn 555
#define max(a,b) a>b?a:b
vector<int>son[maxn];
map<string,int>mapp;
bool f[maxn][3]; // f[i][0]:当前不选的唯一性,f[i][1]:选当前节点的唯一性 1代表唯一,0反之
int dp[maxn][3]; //与上面的差不多
void dfs(int u){
dp[u][0]=0; if(u!=0) dp[u][1]=1;
for(int i=0;i<son[u].size();i++){
int v=son[u][i];
dfs(v);
dp[u][0]+=max(dp[v][1],dp[v][0]);
dp[u][1]+=dp[v][0];
f[u][1]=f[u][1]&f[v][0];
if(dp[v][1]==dp[v][0]) f[u][0]=0;
else if(dp[v][1]>dp[v][0]&&!f[v][1]) f[u][0]=0;
else if(dp[v][0]>dp[v][1]&&!f[v][0]) f[u][0]=0;
}
return;
}
int main(){
int i,j,n;
while(~scanf("%d",&n)){
if(!n) break;
memset(f,1,sizeof(f));
memset(dp,0,sizeof(dp));
for(i=0;i<maxn;i++) son[i].clear();
mapp.clear();
string s1,s2;
cin>>s1;
mapp[s1]=1;
son[0].push_back(1); //让boss为1,并且增加一个点0,当然0不选
int k=1;
for(i=1;i<n;i++){
cin>>s1>>s2;
if(!mapp[s1]) mapp[s1]=++k;
if(!mapp[s2]) mapp[s2]=++k;
son[mapp[s2]].push_back(mapp[s1]);
}
dfs(0);
// for(i=0;i<=n;i++) cout<<dp[i][0]<<" "<<dp[i][1]<<endl;
cout<<dp[0][0]<<" ";
if(f[0][0]) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
Party at Hali-Bula
最新推荐文章于 2019-11-29 19:19:11 发布