#include using namespace std; #define rep(i,a,b) for (int i = (a); i < (b);++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() typedef long long ll; typedef pair pii; typedef vector vi; signed main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); int n; cin >> n; vector> adj(n + 1); for (int i = 0; i + 1 < n; ++i) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } vector sizes(n + 1); vector dp(n + 1); vector> child(n + 1); auto dfs1 = [&adj, &dp, &child, &sizes](auto&& self, int v, int p) -> void { sizes[v] = 1; for (int i : adj[v]) { if (i == p) continue; child[v].push_back(i); self(self, i, v); sizes[v] += sizes[i]; } sort(child[v].begin(), child[v].end(), [&sizes](int a, int b){ return sizes[a] < sizes[b]; }); int cnt = 1; dp[v] = true; for (int i : child[v]) { if (cnt < sizes[i] || !dp[i]) { dp[v] = false; break; } cnt += sizes[i]; } }; dfs1(dfs1, 1, 0); auto dfs2 = [&adj, &dp, &child, &sizes](auto&& self, int v, int p) -> bool { if (p != 0) { child[v].push_back(p); sizes[v] += sizes[p]; } sort(child[v].begin(), child[v].end(), [&sizes](int a, int b){ return sizes[a] < sizes[b]; }); bool res = true; int baddp = -1; int cnt = 1; int first = -1; for (int i : child[v]) { if (first == -1 && cnt < sizes[i]) first = i; if (!dp[i] || cnt < sizes[i]) { res = false; } if (!dp[i]) { if (baddp != -1) { return false; } baddp = i; } cnt += sizes[i]; } if (res) return true; if (baddp != -1) { vector good; for (int i: child[v]) if (i != baddp) good.push_back(i); sort(good.begin(), good.end(), [&sizes](int a, int b) { return sizes[a] < sizes[b]; }); cnt = 1; res = true; for (int i: good) { if (cnt < sizes[i]) { res = false; break; } cnt += sizes[i]; } if (!res) return false; dp[v] = true; sizes[v] -= sizes[baddp]; return self(self, baddp, v); } if (first == -1 || first == p) return false; vector good; for (int i: child[v]) if (i != first) good.push_back(i); sort(good.begin(), good.end(), [&sizes](int a, int b) { return sizes[a] < sizes[b]; }); cnt = 1; res = true; for (int i: good) { if (cnt < sizes[i]) { res = false; break; } cnt += sizes[i]; } if (!res) return false; dp[v] = true; sizes[v] -= sizes[first]; return self(self, first, v); }; if (dfs2(dfs2, 1, 0)) { cout << "YES\n"; } else cout << "NO\n"; return 0; }