#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define all(x) (x).begin(), (x).end() #define bit(x) (1 << (x)) #define cnt1(x) (__builtin_popcount(x)) #define LB lower_bound #define LET(it,v) __typeof(v) it(v) #define mset0(x) memset((x), 0, sizeof((x))) #define mset1(x) memset((x), -1, sizeof((x))) #define pb push_back #define PQ priority_queue #define REP(it,v) for(LET(it,v.begin());it!=v.end();it++) #define sqr(x) ((x)*(x)) #define sz(x) ((int)(x.size())) #define UB upper_bound #define X first #define Y second using namespace std; typedef long long LL; typedef double DB; typedef pair pii; typedef pair pll; typedef vector vi; typedef vector vpii; template inline void chkmin(T &a, T b) { if (b < a) a = b; } template inline void chkmax(T &a, T b) { if (a < b) a = b; } const int MX = 3005; vi con[MX]; pii e[MX]; int par[MX]; int chk[MX], CN; int p[MX], pn; void DFS(int u) { chk[u] = 1; for (int i = 0; i < sz(con[u]); i++) { pii tp = e[con[u][i]]; int v = tp.X + tp.Y - u; if (!chk[v]) DFS(v); } } int vis[MX]; void DFS2(int u, int fe) { chk[u] = 1, par[u] = fe; for (int i = 0; i < sz(con[u]); i++) { if (con[u][i] == fe) continue; pii tp = e[con[u][i]]; int v = tp.X + tp.Y - u; if (chk[v] && !vis[v]) { int tp = u; pn = 1, p[pn] = tp, chk[u] = 2; while (1) { tp = e[par[tp]].X + e[par[tp]].Y - tp; chk[tp] = 2, p[++pn] = tp; if (tp == v) break; } } else { chk[v] = 1; DFS2(v, con[u][i]); } } vis[u] = 1; } int sz[MX]; void DFS1(int u, int pr) { sz[u] = 0; for (int i = 0; i < sz(con[u]); i++) { pii tp = e[con[u][i]]; int v = tp.X + tp.Y - u; if (chk[v] < CN && v != pr) { sz[u]++; DFS1(v, u); } } } bool can(int u, int pr, int fr) { int sz = 0; for (int i = 0; i < sz(con[u]); i++) { pii tp = e[con[u][i]]; int v = tp.X + tp.Y - u; if (chk[v] < CN && v != pr) { sz++; if (!can(v, u, fr)) return 0; } } if (u != fr) return sz <= 1; return sz <= 2; } bool can1(int u, int pr) { int sz = 0; for (int i = 0; i < sz(con[u]); i++) { pii tp = e[con[u][i]]; int v = tp.X + tp.Y - u; if (chk[v] < CN && v != pr) { sz++; if (!can1(v, u)) return 0; } } return sz <= 1; } int n, SS; void in() { int i, j, u, v; for (i = 1; i <= n; i++) { chk[i] = 0; con[i].clear(); } SS = -1; for (i = 1; i <= n; i++) { scanf("%d%d", &u, &v); if (u == v) { SS = u; continue; } e[i].X = u, e[i].Y = v; con[u].pb(i); con[v].pb(i); } } bool solve() { int i, j, u, v; DFS(1); for (i = 1; i <= n; i++) if (!chk[i]) return 0; CN = 2; if (SS != -1) { chk[SS] = 2; return can(SS, -1, SS); } mset0(chk); mset0(vis); DFS2(1, -1); int cnt = 0, flg1 = -1, flg2 = -1; for (j = 1; j <= pn; j++) { DFS1(p[j], -1); if (sz[p[j]]) { if (++cnt == 1) flg1 = j; else flg2 = j; } } if (cnt >= 3) return 0; if (cnt == 2) { if (flg2 != flg1 + 1 && (flg1 != 1 || flg2 != pn)) return 0; } int flg = 1; if (flg1 > 0) flg &= can1(p[flg1], -1); if (flg2 > 0) flg &= can1(p[flg2], -1); return flg; } int main() { while (scanf("%d", &n) == 1) { in(); if (solve()) puts("YES"); else puts("NO"); } return 0; }