일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- DP
- Two Points
- 그래프
- binary search
- Stored Procedure
- union find
- String
- Hash
- Trie
- 다익스트라
- Dijkstra
- Brute Force
- 스토어드 프로시저
- two pointer
- SQL
- 이진탐색
- MYSQL
Archives
- Today
- Total
codingfarm
Union Find 본문
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<iostream> #include<vector> using namespace std; vector<int> union_set; vector<int> union_level; int UnionFind(int index) { if (union_set[index] != -1) { union_set[index] = UnionFind(union_set[index]); return union_set[index]; } else return index; } void UnionMerge(int a, int b) { a = UnionFind(a); b = UnionFind(b); if (a == b) return; //a가 b보다 무조건 낮아야 하며 //a를 b에 무조건 합처야 한다. if (union_level[a] > union_level[b]) swap(a, b); union_set[a] = b; if (union_level[a] == union_level[b]) union_level[b]++; } int main(void) { int N, M; scanf("%d %d", &N, &M); union_set.assign(N + 1, -1); union_level.assign(N + 1, 1); int op, a, b; for (int i = 0; i < M; i++) { scanf("%d %d %d", &op, &a, &b); if (op == 0) { //a와 b 집합을 합친다. UnionMerge(a, b); } else if (op == 1) { //a와 b가 같은지 구한다. if (UnionFind(a) == UnionFind(b)) printf("YES\n"); else printf("NO\n"); } } return 0; } | cs |
'Algorithm & Data structure > 이론' 카테고리의 다른 글
LCA(Lowest Common Ancestor) (0) | 2020.09.06 |
---|---|
MST(Minimum Spanning Tree) & Kruskal (0) | 2020.09.06 |
Merge Sort (0) | 2020.09.06 |
list(static allocation) (0) | 2020.09.06 |
list(dynamic allocation) (0) | 2020.09.05 |
Comments