#include using namespace std; #pragma GCC target("avx2") #pragma GCC optimize("O3") const int DIM = 2e5 + 5; vector edg[DIM]; deque que; bool mrk[DIM]; int siz[DIM]; int n, cent; void dfs(int x, int f) { siz[x] = 1; for (int y : edg[x]) { if (y == f) continue; dfs(y, x); siz[x] += siz[y]; } int mx = n - siz[x]; for (int y : edg[x]) mx = max(mx, siz[y]); if (mx <= n / 2) cent = x; } bool ok = 1; void dfs2(int x, int f) { vector adj; for (int y : edg[x]) if (y != f) adj.push_back(y); sort(adj.begin(), adj.end(), [](int x, int y) { return siz[x] < siz[y]; }); int v = 1; for (int y : adj) { dfs2(y, x); if (!ok) return; if (v >= siz[y]) { v += siz[y]; } else { ok = false; } if (!ok) return; } } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; for (int i = 1; i < n; ++i) { int x, y; cin >> x >> y; edg[x].push_back(y); edg[y].push_back(x); } dfs(1, 0); dfs(cent, 0); dfs2(cent, 0); cout << (ok ? "YES\n" : "NO\n"); return 0; }