// yukicoder: No.483 マッチ並べ // 2019.7.21 bal4u #include #if 1 #define gc() getchar_unlocked() #else #define gc() getchar() #endif int in() { // 非負整数の入力 int n = 0, c = gc(); do n = 10 * n + (c & 0xf); while ((c = gc()) >= '0'); return n; } /* UNION-FIND library */ #define MAX 12900 // > 100*128 + 100 int id[2][MAX+5], size[2][MAX+5]; void init(int n) { int i, k; for (k = 0; k < 2; k++) for (i = 0; i < n; i++) id[k][i] = i, size[k][i] = 1; } int root(int k, int i) { while (i != id[k][i]) id[k][i] = id[k][id[k][i]], i = id[k][i]; return i; } int connected(int k, int p, int q) { return root(k, p) == root(k, q); } void unite(int k, int p, int q) { int i = root(k, p), j = root(k, q); if (i == j) return; if (size[k][i] < size[k][j]) id[k][i] = j, size[k][j] += size[k][i]; else id[k][j] = i, size[k][i] += size[k][j]; } int N; int a[102], b[102]; char f[MAX+5]; int main() { int i, r; N = in(); init(MAX); for (i = 0; i < N; i++) { r = in() << 7, a[i] = r | in(); r = in() << 7, b[i] = r | in(); unite(0, a[i], b[i]); } for (i = 0; i < N; i++) { if (connected(1, a[i], b[i])) { if (++f[root(0, a[i])] >= 2) { puts("NO"); return 0; } } else unite(1, a[i], b[i]); } puts("YES"); return 0; }