#include using namespace std; #include using namespace atcoder; #define rep(i, n) for(int i=0;i<(n);++i) #define rep1(i, n) for(int i=1;i<=(n);i++) #define ll long long using mint = modint; using P = pair; using lb = long double; #ifdef LOCAL # include # define dbg(...) debug_print::multi_print(#__VA_ARGS__, __VA_ARGS__) #else # define dbg(...) (static_cast(0)) #endif int n; vector> dp(2e5+5, vector(2)); vector ans(2e5+5); vector> g(2e5+5); int m; struct Edge { int to, cost; Edge(int to, int cost) : to(to), cost(cost) {} }; template struct ReRooting { public: ReRooting() : ReRooting(0) {} ReRooting(int n) : ReRooting(std::vector(n)) {} ReRooting(const std::vector& v) : _n(int(v.size())) { dp = std::vector(_n); g = std::vector>(_n); ans = std::vector(_n); } void addEdge(int a, int b, int w = 1) { assert(0 <= a && a < _n); assert(0 <= b && b < _n); g[a].push_back(Edge(b, w)); g[b].push_back(Edge(a, w)); } void init(){ dfs1(0); rep(i,_n){ dbg(dp[i].black,dp[i].white); } dfs2(0); } std::vector ans; private: int _n, size, log; std::vector dp; std::vector> g; S dfs1(int u, int p=-1){ for(auto [v, cost] : g[u]) { if(v==p) continue; dp[u] = op(dp[u], dfs1(v,u)); } dbg(u,dp[u].white, dp[u].black); return dp[u] = addRoot(dp[u]); } void dfs2(int u, int p = -1){ int N = g[u].size(); if(N==0) return; vector l(N); vector r(N); rep(i,N){ ans[u] = op(ans[u], dp[g[u][i].to]); } ans[u] = addRoot(ans[u]); l[0] = dp[g[u][0].to]; r[N-1] = dp[g[u][N-1].to]; rep(i,N){ int v = g[u][i].to; if(i-1>=0) { l[i] = op(l[i-1],dp[v]); } } for(int i=N-1;i>=0;i--){ int v = g[u][i].to; if(i+1=0) { dp[u] = op(dp[u], l[i-1]); } if(i+1> n; if(n==1){ cout<<1< rt(n); rep(i,n-1){ int u, v; cin >> u >> v; --u;--v; rt.addEdge(u,v); } rt.init(); int f = 1e9; rep(i,n){ f = min(f, rt.ans[i].black); } cout<