原题链接:https://vjudge.net/problem/UVA-1218
分类:树形DP
备注:树最大独立集变形
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+5;
const int inf=10001;
int n,ed,fa[maxn],dp[maxn][3];
vector<int>sons[maxn];
int d(int u,int o){
if(dp[u][o]!=-1)return dp[u][o];
int &td=dp[u][o];
if(o==0){
td=1;
for(int i=0;i<sons[u].size();i++)
td+=min(d(sons[u][i],0),d(sons[u][i],1));
}else if(o==1){
td=0;
for(int i=0;i<sons[u].size();i++)
td+=d(sons[u][i],2);
}else if(o==2){
td=inf;
for(int i=0;i<sons[u].size();i++)
td=min(td,d(u,1)-d(sons[u][i],2)+d(sons[u][i],0));
}
return td;
}
int main(void){
// freopen("in.txt","r",stdin);
while(~scanf("%d",&n)){
memset(fa,0,sizeof(fa));
memset(dp,-1,sizeof(dp));
for(int i=1;i<=n;i++)sons[i].clear();
for(int i=1;i<n;i++){
int x,y; scanf("%d%d",&x,&y);
if(!fa[y]){
fa[y]=x; sons[x].push_back(y);
}
else {
fa[x]=y; sons[y].push_back(x);
}
}
scanf("%d",&ed);
int rt=1;
while(fa[rt])rt++;
printf("%d\n",min(d(rt,0),d(rt,2)));
if(ed==-1)break;
}
return 0;
}