๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค with Python]_33_์๋ก์ ์งํฉ ์๋ฃ๊ตฌ์กฐ ๋ณธ๋ฌธ
[์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค with Python]_33_์๋ก์ ์งํฉ ์๋ฃ๊ตฌ์กฐ
์ง์ง์ํ์นด 2022. 2. 13. 00:16220213 ์์ฑ
<๋ณธ ๋ธ๋ก๊ทธ๋ ใ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋คใ ์ youtube๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค>
https://www.youtube.com/watch?v=Ha0w2dJa2Nk&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=33
1. ์๋ก์ ์งํฉ (Disjoint Sets)SS
: ๊ณตํต ์์๊ฐ ์๋ ๋ ์งํฉ
2. ์๋ก์ ์งํฉ ์๋ฃ ๊ตฌ์กฐ
: ์๋ก์ ๋ถ๋ถ ์งํฉ๋ค๋ก ๋๋์ด์ง ์์๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ
-> ํฉ์งํฉ (union) : ๋ ๊ฐ์ ์์๊ฐ ํฌํจ๋ ์งํฉ์ ํ๋์ ์งํฉ์ผ๋ก ํฉ์น๋ ์ฐ์ฐ
-> ์ฐพ๊ธฐ (find) : ํน์ ํ ์์๊ฐ ์ํ ์งํฉ์ด ์ด๋ค ์งํฉ์ธ์ง ์๋ ค์ฃผ๋ ์ฐ์ฐ
: ํฉ์น๊ธฐ ์ฐพ๊ธฐ ์๋ฃ๊ตฌ์กฐ๋ผ ๋ถ๋ฆฐ๋ค
1) ํฉ์งํฉ ์ฐ์ฐ ํ์ธ, ์๋ก ์ฐ๊ฒฐ๋ ๋ ธ๋ A, B ํ์ธ
- A์ B์ ๋ฃจํธ ๋ ธ๋ A', B' ๊ฐ๊ฐ ์ฐพ๊ธฐ
- A'๋ฅผ B'์ ๋ถ๋ชจ ๋ ธ๋๋ก ์ค์
2) ๋ชจ๋ ํฉ์งํฉ ์ฐ์ฐ์ ์ฒ๋ฆฌํ ๋๊น์ง 1๋ฒ์ ๊ณผ์ ๋ฐ๋ณต
=> ์ฐ๊ฒฐ์ฑ์ ํตํด ์์ฝ๊ฒ ์งํฉ์ ํํ ํ์ธ ๊ฐ๋ฅ
=> ๋ฃจํธ ๋ ธ๋์ ์ฆ์ ์ ๊ทผ X
=> ๋ฃจํธ ๋ ธ๋์ ์ ๊ทผํ๊ธฐ์ํด ๋ถ๋ชจ ํ ์ด๋ธ์ ๊ณ์ํด์ ํ์ธํ๋ฉฐ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๊ธฐ
- python
# ํน์ ์์๊ฐ ์ํ ์งํฉ์ ์ฐพ๊ธฐ
def find_parent(parent, x):
# ๋ฃจํธ ๋
ธ๋๊ฐ ์๋๋ผ๋ฉด, ๋ฃจํธ ๋
ธ๋๋ฅผ ์ฐพ์ ๋๊น์ง ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
if parent[x] != x:
return find_parent(parent, parent[x])
return x
# ๋ ์์๊ฐ ์ํ ์งํฉ์ ํฉ์น๊ธฐ
def union_parent(parent, a, b):
a = find_parent(parent, a)
b = find_parent(parent, b)
if a < b:
parent[b] = a
else:
parent[a] = b
# ๋
ธ๋์ ๊ฐ์์ ๊ฐ์ (Union ์ฐ์ฐ)์ ๊ฐ์ ์
๋ ฅ ๋ฐ๊ธฐ
v, e = map(int, input().split())
parent = [0] * (v + 1) # ๋ถ๋ชจ ํ
์ด๋ธ ์ด๊ธฐํํ๊ธฐ
# ๋ถ๋ชจ ํ
์ด๋ธ์์์, ๋ถ๋ชจ๋ฅผ ์๊ธฐ ์์ ์ผ๋ก ์ด๊ธฐํ
for i in range(1, v + 1):
parent[i] = i
# Union ์ฐ์ฐ์ ๊ฐ๊ฐ ์ํ
for i in range(e):
a, b = map(int, input().split())
union_parent(parent, a, b)
# ๊ฐ ์์๊ฐ ์ํ ์งํฉ ์ถ๋ ฅํ๊ธฐ
print('๊ฐ ์์๊ฐ ์ํ ์งํฉ: ', end='')
for i in range(1, v + 1):
print(find_parent(parent, i), end=' ')
print()
# ๋ถ๋ชจ ํ
์ด๋ธ ๋ด์ฉ ์ถ๋ ฅํ๊ธฐ
print('๋ถ๋ชจ ํ
์ด๋ธ: ', end='')
for i in range(1, v + 1):
print(parent[i], end=' ')
- c++
#include <bits/stdc++.h>
using namespace std;
// ๋
ธ๋์ ๊ฐ์(V)์ ๊ฐ์ (Union ์ฐ์ฐ)์ ๊ฐ์(E)
// ๋
ธ๋์ ๊ฐ์๋ ์ต๋ 100,000๊ฐ๋ผ๊ณ ๊ฐ์
int v, e;
int parent[100001]; // ๋ถ๋ชจ ํ
์ด๋ธ ์ด๊ธฐํํ๊ธฐ
// ํน์ ์์๊ฐ ์ํ ์งํฉ์ ์ฐพ๊ธฐ
int findParent(int x) {
// ๋ฃจํธ ๋
ธ๋๊ฐ ์๋๋ผ๋ฉด, ๋ฃจํธ ๋
ธ๋๋ฅผ ์ฐพ์ ๋๊น์ง ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
if (x == parent[x]) return x;
return findParent(parent[x]);
}
// ๋ ์์๊ฐ ์ํ ์งํฉ์ ํฉ์น๊ธฐ
void unionParent(int a, int b) {
a = findParent(a);
b = findParent(b);
if (a < b) parent[b] = a;
else parent[a] = b;
}
int main(void) {
cin >> v >> e;
// ๋ถ๋ชจ ํ
์ด๋ธ์์์, ๋ถ๋ชจ๋ฅผ ์๊ธฐ ์์ ์ผ๋ก ์ด๊ธฐํ
for (int i = 1; i <= v; i++) {
parent[i] = i;
}
// Union ์ฐ์ฐ์ ๊ฐ๊ฐ ์ํ
for (int i = 0; i < e; i++) {
int a, b;
cin >> a >> b;
unionParent(a, b);
}
// ๊ฐ ์์๊ฐ ์ํ ์งํฉ ์ถ๋ ฅํ๊ธฐ
cout << "๊ฐ ์์๊ฐ ์ํ ์งํฉ: ";
for (int i = 1; i <= v; i++) {
cout << findParent(i) << ' ';
}
cout << '\n';
// ๋ถ๋ชจ ํ
์ด๋ธ ๋ด์ฉ ์ถ๋ ฅํ๊ธฐ
cout << "๋ถ๋ชจ ํ
์ด๋ธ: ";
for (int i = 1; i <= v; i++) {
cout << parent[i] << ' ';
}
cout << '\n';
}
- java
import java.util.*;
public class Main {
// ๋
ธ๋์ ๊ฐ์(V)์ ๊ฐ์ (Union ์ฐ์ฐ)์ ๊ฐ์(E)
// ๋
ธ๋์ ๊ฐ์๋ ์ต๋ 100,000๊ฐ๋ผ๊ณ ๊ฐ์
public static int v, e;
public static int[] parent = new int[100001]; // ๋ถ๋ชจ ํ
์ด๋ธ ์ด๊ธฐํํ๊ธฐ
// ํน์ ์์๊ฐ ์ํ ์งํฉ์ ์ฐพ๊ธฐ
public static int findParent(int x) {
// ๋ฃจํธ ๋
ธ๋๊ฐ ์๋๋ผ๋ฉด, ๋ฃจํธ ๋
ธ๋๋ฅผ ์ฐพ์ ๋๊น์ง ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
if (x == parent[x]) return x;
return findParent(parent[x]);
}
// ๋ ์์๊ฐ ์ํ ์งํฉ์ ํฉ์น๊ธฐ
public static void unionParent(int a, int b) {
a = findParent(a);
b = findParent(b);
if (a < b) parent[b] = a;
else parent[a] = b;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
v = sc.nextInt();
e = sc.nextInt();
// ๋ถ๋ชจ ํ
์ด๋ธ์์์, ๋ถ๋ชจ๋ฅผ ์๊ธฐ ์์ ์ผ๋ก ์ด๊ธฐํ
for (int i = 1; i <= v; i++) {
parent[i] = i;
}
// Union ์ฐ์ฐ์ ๊ฐ๊ฐ ์ํ
for (int i = 0; i < e; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
unionParent(a, b);
}
// ๊ฐ ์์๊ฐ ์ํ ์งํฉ ์ถ๋ ฅํ๊ธฐ
System.out.print("๊ฐ ์์๊ฐ ์ํ ์งํฉ: ");
for (int i = 1; i <= v; i++) {
System.out.print(findParent(i) + " ");
}
System.out.println();
// ๋ถ๋ชจ ํ
์ด๋ธ ๋ด์ฉ ์ถ๋ ฅํ๊ธฐ
System.out.print("๋ถ๋ชจ ํ
์ด๋ธ: ");
for (int i = 1; i <= v; i++) {
System.out.print(parent[i] + " ");
}
System.out.println();
}
}
+ ๋ฌธ์ ์
: ํฉ์งํฉ ์ฐ์ฐ์ด ํธํฅ๋๋ค๋ฉด ์ฐพ๊ธฐ ํจ์๊ฐ ๋นํจ์จ์ ์ผ๋ก ๋์
: ์ฐพ๊ธฐ ํจ์๊ฐ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ค ํ์ธํ๊ธฐ ๋๋ฌธ์ ์๊ฐ ๋ณต์ก๋๋ O(V)
3. ๊ฒฝ๋ก ์์ถ
: ์ฐพ๊ธฐ ํจ์๋ฅผ ์ต์ ํ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก ๊ฒฝ๋ก ์์ถ ์ด์ฉ
: ์ฐพ๊ธฐ ํจ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ ๋ค์ ๋ถ๋ชจ ํ ์ด๋ธ ๊ฐ์ ๋ฐ๋ก ๊ฐฑ์ !!!
: ๊ฐ ๋ ธ๋์ ๋ํ์ฌ ์ฐพ๊ธฐ ํจ์๋ฅผ ํธ์ถํ ์ดํ์ ํด๋น ๋ ธ๋์ ๋ฃจํธ ๋ ธ๋๊ฐ ๋ฐ๋ก ๋ถ๋ชจ ๋ ธ๋๊ฐ ๋๋ค
# ํน์ ์์๊ฐ ์ํ ์งํฉ์ ์ฐพ๊ธฐ
def find_parent(parent, x):
# ๋ฃจํธ ๋
ธ๋๊ฐ ์๋๋ผ๋ฉด, ๋ฃจํธ ๋
ธ๋๋ฅผ ์ฐพ์ ๋๊น์ง ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
if parent[x] != x:
parent[x] = find_parent(parent, parent[x])
return parent[x]