#include #include "testlib.h" using namespace std; using ll = long long; // 制約に書かれている定数を宣言 const ll Nmin = 1, Nmax = 100000; struct UnionFind { ll cnt; vector par, siz; UnionFind(ll N) : par(N, -1LL), siz(N, 1LL) {cnt = N;} ll root(ll v) { if (par[v] == -1) return v; return par[v] = root(par[v]); } bool same(ll u, ll v) { return root(u) == root(v); } bool unite(ll u, ll v) { u = root(u); v = root(v); if (u == v) return false; if (siz[u] < siz[v]) swap(u, v); par[v] = u; siz[u] += siz[v]; cnt--; return true; } ll size(ll v) { v = root(v); return siz[v]; } ll count() { return cnt; } }; int main(){ registerValidation(); int N = inf.readLong(Nmin, Nmax); inf.readEoln(); UnionFind uf(N+1); for(ll i = 0; i < N-1; i++){ ll u = inf.readLong(Nmin, Nmax); inf.readSpace(); ll v = inf.readLong(Nmin, Nmax); inf.readEoln(); assert(u < v); assert(v <= N); uf.unite(u, v); } assert(uf.count() == 2); inf.readEof(); return 0; }