#include using namespace std; using ll=long long; const ll ILL=2167167167167167167; const int INF=2100000000; #define rep(i,a,b) for (int i=(int)(a);i<(int)(b);i++) #define all(p) p.begin(),p.end() template using pq_ = priority_queue, greater>; template int LB(vector &v,T a){return lower_bound(v.begin(),v.end(),a)-v.begin();} template int UB(vector &v,T a){return upper_bound(v.begin(),v.end(),a)-v.begin();} template bool chmin(T &a,T b){if(b bool chmax(T &a,T b){if(a void So(vector &v) {sort(v.begin(),v.end());} template void Sore(vector &v) {sort(v.begin(),v.end(),[](T x,T y){return x>y;});} bool yneos(bool a,bool upp=false){if(a){cout<<(upp?"YES\n":"Yes\n");}else{cout<<(upp?"NO\n":"No\n");}return a;} template void vec_out(vector &p,int ty=0){ if(ty==2){cout<<'{';for(int i=0;i<(int)p.size();i++){if(i){cout<<",";}cout<<'"'< T vec_min(vector &a){assert(!a.empty());T ans=a[0];for(auto &x:a) chmin(ans,x);return ans;} template T vec_max(vector &a){assert(!a.empty());T ans=a[0];for(auto &x:a) chmax(ans,x);return ans;} template T vec_sum(vector &a){T ans=T(0);for(auto &x:a) ans+=x;return ans;} int pop_count(long long a){int res=0;while(a){res+=(int)(a&1),a>>=1;}return res;} template T square(T a){return a * a;} void solve(); // DEAR MYSTERIES / TOMOO int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t = 1; // cin >> t; rep(i, 0, t) solve(); } void solve(){ int N; cin >> N; vector> G(N); rep(i, 0, N - 1) { int a, b; cin >> a >> b; a--, b--; G[a].push_back(b); G[b].push_back(a); } auto dfs = [&](auto self, int var, int pare) -> pair { int bl = INF; int wh = INF; vector> p; for (auto x : G[var]) if (x != pare) { p.push_back(self(self, x, var)); } bl = 1; for (auto x : p) bl += x.second; sort(all(p), [&](pair l, pair r) { return l.first - l.second < r.first - r.second; }); auto f = [&](int k) -> int { int res = 0; rep(i, 0, p.size()) { if (i < k) res += p[i].first; else res += p[i].second; } return res; }; if ((int)G[var].size() / 2 < (int)p.size()) { chmin(bl, f((int)(G[var].size()) / 2 + 1)); } { chmin(wh, f((int)G[var].size() / 2)); } chmin(wh, bl); // cout << var << " " << bl << " " << wh << endl; return {bl, wh}; }; auto ans = dfs(dfs, 0, -1); cout << ans.first << "\n"; } /* * 操作 2 は最後にやるとして、 * 葉は操作しなくていいっす * all 黒から初めて、 * 黒い頂点で、周りも黒いやつをとるとする * * やっぱり元の設定に戻ります * 葉は白です * 子が全て白であるやつは黒にしないとだめだ * 3 種類あって、 * a 黒 * b 下だけで黒にできる * c 上が黒なら黒にできる * * b * 下のうち、ab が小さいやつを選ぶ * * c * 大体同じか * * */