#include using namespace std; using LL=long long; #define FOR(i, l, r)for(int i = (l); i<=(r);++i) #define REP(i, n)FOR(i,0,(n)-1) #define ssize(x)int(x.size()) auto&operator<<(auto&o,pairp) { return o << "(" << p.first << ", " << p.second << ")"; } auto operator<<(auto&o, auto x)->decltype(x.end(),o){ o<<"{";int i=0;for(auto e:x)o<<", "+!i++<> N; vector stopnie(N); vector> sasiedzi(N); for(int i = 0; i < N - 1; i++) { int a, b; cin >> a >> b; a--; b--; stopnie[a]++; stopnie[b]++; sasiedzi[a].push_back(b); sasiedzi[b].push_back(a); } priority_queue, vector>, greater>> pq; for(int i = 0; i < N; i++) { if(stopnie[i] == 1) pq.push({1 ,i}); } bool ok = true; vector mrowki(N, 1); while(pq.size() > 1) { auto curr = pq.top(); pq.pop(); int rodzic = -1; for(int neigh : sasiedzi[curr.second]) { if(stopnie[neigh] != 0) { rodzic = neigh; } } assert(rodzic != -1); if(mrowki[curr.second] <= mrowki[rodzic]) { mrowki[rodzic] += mrowki[curr.second]; stopnie[curr.second]--; stopnie[rodzic]--; if(stopnie[rodzic] == 1) { pq.push({mrowki[rodzic], rodzic}); } } else { ok = false; break; } } if(!ok) { cout << "NO" << endl; } else { cout << "YES" << endl; } }