#pragma GCC optimize ("O3") #include "bits/stdc++.h" using namespace std; #define rep(i, b, e) for(int i = (b); i <= (e); i++) #define per(i, b, e) for(int i = (e); i >= (b); i--) #define FOR(i, b, e) rep(i, b, (e) - 1) #define SZ(x) int(x.size()) #define all(x) x.begin(), x.end() #define pb push_back #define mp make_pair #define st first #define nd second using ll = long long; using pii = pair; using vi = vector; auto &operator<<(auto &o, pair p) { return o << "(" << p.st << ", " << p.nd << ")"; } auto operator<<(auto &o, auto x)->decltype(end(x), o) { o << "{"; int i=0; for(auto e: x) o << ", " + 2*!i++ << e; return o << "}"; } #ifdef LOCAL #define deb(x...) cerr << "[" #x << "]: ", [](auto...$) { ((cerr << $ << "; "),...) << endl; }(x) #else #define deb(...) #endif const int nax = 2e5 + 5; vector adj[nax]; int n; int sz[nax]; vector cands; void dfs(int v, int p){ sz[v] = 1; for(int x : adj[v]){ if(x == p) continue; dfs(x, v); sz[v] += sz[x]; } int mx = 0; for(int x : adj[v]){ if(x == p) continue; mx = max(mx, sz[x]); } // deb(v, mx, n - sz[v]); mx = max(mx, n - sz[v]); // deb("AA", mx, v, n / 2); // deb(v, mx); if(mx <= n / 2) cands.pb(v); } bool calc(int v, int p){ vector s; sz[v] = 1; bool spoko = true; for(int x : adj[v]){ if(x == p) continue; if(!calc(x, v)) spoko = false; sz[v] += sz[x]; s.pb(sz[x]); } sort(all(s)); int mam = 1; for(int x : s){ if(x > mam) spoko = false; mam += x; } return spoko; } void solve() { cin >> n; rep(i, 1, n - 1){ int x, y; cin >> x >> y; adj[x].pb(y); adj[y].pb(x); } dfs(1, 1); // deb(cands); bool ok = false; for(int x : cands){ if(calc(x, x)) ok = true; } if(ok) cout << "YES" << "\n"; else cout << "NO" << "\n"; } int main() { cin.tie(0)->sync_with_stdio(0); int tt = 1; // cin >> tt; FOR(te, 0, tt) solve(); return 0; }