原题链接:https://vjudge.net/problem/UVA-1220
分类:树形DP
备注:树的最大独立集
#include<bits/stdc++.h>
using namespace std;
const int maxn=205;
int n,cnt,dp[maxn][2],f[maxn][2];
string x,s;
vector<int>sons[maxn];
map<string,int>id;
int d(int u,int o){
if(dp[u][o]!=-1)return dp[u][o];
int& td=dp[u][o]=0;
int& tf=f[u][o];
if(o==0){
for(int i=0;i<sons[u].size();i++){
int d0=d(sons[u][i],0),d1=d(sons[u][i],1);
if(d0==d1){
td+=d0; tf=0;
}
else if(d0>d1){
td+=d0; tf&=f[sons[u][i]][0];
}else if(d0<d1){
td+=d1; tf&=f[sons[u][i]][1];
}
}
}else if(o==1){
td=1;
for(int i=0;i<sons[u].size();i++){
td+=d(sons[u][i],0);
tf&=f[sons[u][i]][0];
}
}
return td;
}
int main(void){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
while(~scanf("%d",&n)&&n){
id.clear();
memset(f,1,sizeof(f));
memset(dp,-1,sizeof(dp));
for(int i=0;i<n;i++)sons[i].clear();
cnt=0;
cin>>s;
id[s]=cnt++;
for(int i=1;i<n;i++){
cin>>x>>s;
if(!id.count(x))id[x]=cnt++;
if(!id.count(s))id[s]=cnt++;
sons[id[s]].push_back(id[x]);
}
int d0=d(0,0),d1=d(0,1);
if(d0==d1){
printf("%d No\n",d0);
}else if(d0>d1){
printf("%d %s\n",d0,f[0][0]?"Yes":"No");
}else if(d0<d1){
printf("%d %s\n",d1,f[0][1]?"Yes":"No");
}
}
return 0;
}