#include <iostream>
#include <vector>
using namespace std;
const int N=10007;
int n;
vector<int> e[N];
int dp[N][3];
void dfs(int x, int fa){
for(int i=0;i<e[x].size();i++)
if(fa!=e[x][i])
dfs(e[x][i], x);
dp[x][0]=1;
for(int i=0;i<e[x].size();i++)
if(fa!=e[x][i])
dp[x][0]+=dp[e[x][i]][2];
dp[x][1]=dp[x][0];
for(int i=0;i<e[x].size();i++){
if(fa!=e[x][i]){
int sum=dp[e[x][i]][0];
for(int j=0;j<e[x].size();j++)
if(fa!=e[x][j] && e[x][i]!=e[x][j])
sum+=dp[e[x][j]][1];
dp[x][1]=min(dp[x][1], sum);
}
}
for(int i=0;i<e[x].size();i++)
if(fa!=e[x][i])
dp[x][2]+=dp[x][1];
dp[x][2]=min(dp[x][1], dp[x][2]);
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
int x, y;
cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs(1, 0);
cout<<dp[1][1]<<endl;
return 0;
}
WA #4-9 状态表示: dp[x][0]表示在点x管到x的上面一层的最小信号塔数。 dp[x][1]表示在点x管到x这一层的最小信号塔数。 dp[x][2]表示在点x管到x的下面一层的最小信号塔数。