#include #define int long long using namespace std; void solve() { int n; cin >> n; vector> g(n); for (int i = 0; i < n - 1; i++) { int a, b; cin >> a >> b; a--, b--; g[a].push_back(b); g[b].push_back(a); } vector> sz(n); vector> good(n); for (int i = 0; i < n; i++) { sz[i].resize(g[i].size(), -1); good[i].resize(g[i].size(), -1); } function dfs = [&](int v, int pt) { if (sz[v][pt] != -1) return; sz[v][pt] = 1; int u = g[v][pt]; vector sizes; bool isgood = 1; for (int i = 0; i < g[u].size(); i++) { if (g[u][i] == v) continue; if (sz[u][i] == -1) dfs(u, i); sz[v][pt] += sz[u][i]; // maxsz = max(maxsz, sz[u][i]); sizes.push_back(sz[u][i]); isgood &= good[u][i]; } sort(sizes.begin(), sizes.end()); int cur = 1; for (int i = 0; i < sizes.size(); i++) { int ns = sizes[i]; if (ns > cur) { isgood = 0; break; } cur += ns; } if (isgood) { good[v][pt] = 1; } else { good[v][pt] = 0; } }; for (int i = 0; i < n; i++) { bool gg = 1; vector sizes; for (int j = 0; j < g[i].size(); j++) { if (sz[i][j] == -1) dfs(i, j); if (!good[i][j]) gg = 0; sizes.push_back(sz[i][j]); } sort(sizes.begin(), sizes.end()); int cur = 1; for (int i = 0; i < sizes.size(); i++) { int ns = sizes[i]; if (ns > cur) { gg = 0; break; } cur += ns; } if (gg) { cout << "YES\n"; return; } } cout << "NO\n"; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); solve(); return 0; }