BAEKJOON ONLINE JUDGE
1717 집합의 표현
https://www.acmicpc.net/problem/1717


상호배타적 집합의 예제 문제 (DisJointSet)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #include <stdio.h> int n, m; int parent[1000001]; int rank[1000001]; void init() { int i; for (i = 0; i <= n; i++) { parent[i] = i; rank[i] = 1; } } int find(int one) { if (parent[one] == one) return one; return find(parent[one]); } void unionset(int one, int two) { int u, v; u = find(one); v = find(two); if (u == v) return; if (rank[u] > rank[v]) parent[v] = u; else if (rank[u] == rank[v]) { parent[v] = u; rank[u]++; } else parent[u] = v; } int main() { int i; int order, one, two; scanf("%d %d", &n, &m); init(); for (i = 0; i < m; i++) { scanf("%d %d %d", &order, &one, &two); if (order) { if (find(one) == find(two)) printf("YES\n"); else printf("NO\n"); } else { unionset(one, two); } } return 0; } | cs |