//chatgpt(一時チャット)による出力 #include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; vector> gph(N); for (int i = 0; i < N - 1; ++i) { int u, v; cin >> u >> v; --u; --v; gph[u].push_back(v); gph[v].push_back(u); } // 根を 0 に固定 vector parent(N, -1), order; order.reserve(N); stack st; st.push(0); parent[0] = 0; while (!st.empty()) { int v = st.top(); st.pop(); order.push_back(v); for (int to : gph[v]) { if (to == parent[v]) continue; parent[to] = v; st.push(to); } } vector f(N, 0), gg(N, 0); const long long INF = (1LL << 60); for (int idx = N - 1; idx >= 0; --idx) { int v = order[idx]; vector diffs; long long base = 0; for (int to : gph[v]) { if (to == parent[v]) continue; base += gg[to]; diffs.push_back(f[to] - gg[to]); } sort(diffs.begin(), diffs.end()); long long pref = 0; vector ps(diffs.size() + 1, 0); for (int i = 0; i < (int)diffs.size(); ++i) { ps[i + 1] = ps[i] + diffs[i]; } int deg = (int)gph[v].size(); int need0 = deg / 2 + 1; // 親が白 int need1 = need0 - 1; // 親が黒 auto take = [&](int need) -> long long { if (need < 0) need = 0; if (need > (int)diffs.size()) return INF; return base + ps[need]; }; long long seed_v = 1 + base; // v を最初に塗る f[v] = min(seed_v, take(need0)); gg[v] = min(seed_v, take(need1)); } cout << f[0] << '\n'; return 0; }