#include <bits/stdc++.h>   using namespace std;   const int N = 5050;   const int inf = 0x3f3f3f3f;   int to[N * 2], nxt[N * 2], pre[N * 2], cnt, n, tot[N], dp[N][N][2];   void makeedge(int x, int y) {     to[cnt] = x;     nxt[cnt] = pre[y];     pre[y] = cnt++;     to[cnt] = y;     nxt[cnt] = pre[x];     pre[x] = cnt++;   }   int dfs(int x, int fa) {     int son = 0;     if (tot[x] == 1) {       son = 1;       dp[x][0][1] = 0;       dp[x][1][0] = 0;     } else {       dp[x][0][1] = 0;       dp[x][0][0] = 0;     }     for (int p = pre[x]; p != -1; p = nxt[p]) {       int y = to[p];       if (y == fa) continue;       int tmp = dfs(y, x);       for (int j = son; j >= 0; j--) {         for (int k = tmp; k >= 1; k--) {           dp[x][j + k][0] =               min(dp[x][j + k][0],                   min(dp[x][j][0] + dp[y][k][1] + 1, dp[x][j][0] + dp[y][k][0]));           dp[x][j + k][1] =               min(dp[x][j + k][1],                   min(dp[x][j][1] + dp[y][k][0] + 1, dp[x][j][1] + dp[y][k][1]));         }         dp[x][j][0] = min(inf, dp[x][j][0] + min(dp[y][0][1] + 1, dp[y][0][0]));         dp[x][j][1] = min(inf, dp[x][j][1] + min(dp[y][0][0] + 1, dp[y][0][1]));       }       son += tmp;     }     return son;   }   int main() {     scanf( %d , &n);     memset(pre, -1, sizeof(pre));     memset(dp, inf, sizeof(dp));     for (int i = 1; i < n; i++) {       int x, y;       scanf( %d%d , &x, &y);       tot[x]++;       tot[y]++;       makeedge(x, y);     }     if (n == 2) {       printf( 1 n );       return 0;     }     int son = 0, S;     for (int i = 1; i <= n; i++) {       if (tot[i] != 1)         S = i;       else         son++;     }     dfs(S, 0);     printf( %d n , min(dp[S][son / 2][0], dp[S][son / 2][1]));   }   