#include using namespace std; void dfs(int r, vector & sz, vector> & adj){ sz[r] = 1; for (int u : adj[r]) if (sz[u] == -1){ dfs(u, sz, adj); sz[r] += sz[u]; } } int_fast32_t find_centroid(vector> & adj){ vector sz(adj.size(),-1); dfs(0, sz, adj); assert(sz[0] == adj.size()); int r = 0; bool change = true; while (change){ change = false; for (int u : adj[r]) if (sz[u] < sz[r]){ if (sz[u] > adj.size() / 2){ change = true; r = u; break; } } } return r; } int check(int r, vector> & adj, int root = -1){ vector sz; for (int u : adj[r]) if (u != root){ int t = check(u, adj, r); if (t == -1) return -1; sz.push_back(t); } //if can; sort(sz.begin(), sz.end()); int ret = 1; for (int x : sz){ if (x > ret) return -1; ret += x; } return ret; } int main(){ int n; cin >> n; vector> adj(n, vector()); for (int i = 0; i < n - 1; ++i){ int u, v; cin >> u >> v; u--, v--; adj[u].push_back(v); adj[v].push_back(u); } int r = find_centroid(adj); if (check(r, adj) != -1) cout << "YES"; else cout << "NO"; }