- ์ฐ๊ฒฐ ๊ทธ๋ํ
- ๊ฐ์ ์ ๋ฐฉํฅ์ด ์๋ ๊ทธ๋ํ์์ ๋ชจ๋ ์ ์ ๋ค ๊ฐ์ ๊ฐ์ ์ ๋ฐ๋ผ ์๋ก ๋ค๋ค๋ฅผ ์ ์๋ ๊ทธ๋ํ
- ๊ทธ๋ํ ์ด๋ก ์์ 'ํธ๋ฆฌ'๋ "์ธ์ดํด์ด ์๋ ์ฐ๊ฒฐ๋ ๊ทธ๋ํ"๋ก ์ ์๋จ
- ํธ๋ฆฌ
- ์ต์ํ์ ๊ฐ์ ์ ์ฌ์ฉํ๋ฉด์ ์ฐ๊ฒฐ๋ ๊ทธ๋ํ
- ์ ์ฅ ํธ๋ฆฌ ๋น์ฉ
- ๊ทธ๋ํ์ ๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ์๋ค๋ฉด, ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฐ์ ์ ๊ฐ์ค์น๋ฅผ ๋ค ๋ํ ๊ฒ
- ์ต์ ์ ์ฅ ํธ๋ฆฌ
- ๊ฐ์ค์น๊ฐ ์๋ ๋ฌดํฅ ๊ทธ๋ํ๋ก๋ถํฐ ๋ง๋ค ์ ์๋ ๋ชจ๋ ์ ์ฅ ํธ๋ฆฌ ์ค, ๋น์ฉ์ด ๊ฐ์ฅ ๋ฎ์ ํธ๋ฆฌ
- ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ
- ํ๋์ ์ ์ ์งํฉ์ ์ ์ ํค์๋๊ฐ๋ ๋ฐฉ์
- ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ
- ์ฌ๋ฌ ์ ์ ์งํฉ์ผ๋ก ์์ํด์ ์งํฉ๋ค์ ํฉ์ณ๋๊ฐ๋ ๋ฐฉ์
ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ
- ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ์ฐพ๋๋ค๋ ๊ฒ์ ๊ถ๊ทน์ ์ผ๋ก |V|-1๊ฐ์ ๊ฐ์ ์ ์ฐพ๋ ๊ณผ์
- ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฌด ๊ฐ์ ๋ ์๋ ์ํ์์ ๊ฐ์ ์ ํ๋์ฉ ๋ํ๋ ์์ ์ |V|-1๋ฒ ํ๋ค
- ์ ์ ์งํฉ S๋ฅผ ์ด์ฉํจ
- ์ฒ์์๋ ์์์ ์ r ํ๋๋ก ์์ํด์ ํ ๋ฒ์ ์ ์ ์ ํ๋์ฉ ๋ํด๊ฐ
- ์ ์ ์ ํ๋ ๋ํ ๋ ๋์๋๋ ๊ฐ์ ์ด ํ๋์ฉ ๋ํด์ง
- ์ ์ |V|-1๊ฐ๋ฅผ ๋ํ๋ฉด ๋ชจ๋ ์ ์ ์ด ์งํฉ S์ ๋ค์ด์ค๊ธฐ๋จ
- |V|-1๊ฐ์ ๊ฐ์ ์ด ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ์ด๋ฃธ
- ์ธ์ ํ ์ ์ ์ค ํ์ฌ๊น์ง์ ๊ณ์ฐ ๊ฒฐ๊ณผ ์ ์ v๋ฅผ ์ ์ฅํธ๋ฆฌ์ ์ฐ๊ฒฐ์ํฌ ๋ ๊ฐ์ฅ ์ต์ ๋น์ฉ์ ๋๋ ์ ์ u๋ฅผ ์ ์ฅํจ
- ์ด์
- ์งํฉ S๋ก ๋ค์ด๊ฐ ์ ์ ์ ์ํด์ ์ต์ ์ฐ๊ฒฐ ๋น์ฉ์ ๋ณ๋์ด ์๊ธฐ๋ ๊ฒ. ๊ฐ์ด ๋ฐ๋๋ ๊ฒ
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ
- ์ฌ๋ฌ ์ ์ ์งํฉ์ผ๋ก ์์ํด์ ์งํฉ๋ค์ ํฉ์ณ๋๊ฐ๋ ๋ฐฉ์์ผ๋ก ์๋
- ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๋ฌ ์ ์ ์งํฉ๋ค์ ์ด์ํจ
- ๊ฐ ์ ์ ์งํฉ์ ์ธ์ดํด์ด ์๋ ์ฐ๊ฒฐ๋ ๊ทธ๋ํ๋ก ํ๋์ ํธ๋ฆฌ์ ํด๋นํจ
- ํธ๋ฆฌ๋ฅผ ํฉ์ณ์ ํ๋์ ํธ๋ฆฌ๋ฅผ ๋ง๋ค๋ ค๋ฉด, ์ ๋์ ์ด ๋ ์งํฉ์ ๊ฑธ์ณ ์๋ ๊ฐ์ ์ด ํ์ํจ
- ์ฒ์์ n๊ฐ์ ํธ๋ฆฌ๋ก ์์ํ์ฌ์, ๋ ํธ๋ฆฌ๋ฅผ ํ๋๋ก ํฉ์น๋ ๊ณผ์ ์ n-1๋ฒ ์ํํ๋ฉด ํ๋์ ํธ๋ฆฌ๊ฐ ๋จ
- ๊ฐ์ ์ ๋ํ๋ ๊ท์น
- ์ค๊ฐ์ ํ ์์ ์ ๊ท๋ฉ์ ์ผ๋ก ๋ณด๋ฉด, ๊ทธ ์์ ์ ๊ตฌ์ถ๋ ์๋ก ๋ค๋ฅธ ์งํฉ์ ์ฐ๊ฒฐํ๋ ๋ชจ๋ ๊ฐ์ ์ค ์ต์ ๋น์ฉ ๊ฐ์ ์ ์ ํํจ
- ํ ๋ฒ์ ์ต์ ๋น์ฉ ๊ฐ์ ์ ํ๋์ฉ ๋ํ๋๋ฐ, ๊ธฐ์กด์ ํ์ ํด๋์ ๊ฐ์ ์งํฉ๊ณผ ์ธ์ดํด์ ๋ง๋ค์ง ์๋ ๋ฒ์์์ ๋ํจ
- ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ๋จผ์ ๋ชจ๋ ๊ฐ์ ์ ๋น์ฉ์ด ์์ ์์๋ก ์ ๋ ฌํจ
- ์ ์ ๋ค์ n๊ฐ์ ์งํฉ์ผ๋ก ์ด๊ธฐํํจ
- ๋น์ฉ์ด ๊ฐ์ฅ ์์ ๊ฐ์ ๋ถํฐ ์ฐจ๋ก๋ก ํ ๋ฒ์ฉ ์ดํ
- ํด๋น ๊ฐ์ ์ด ๋ ์ ์ ์งํฉ์ ํ๋๋ก ํฉ์น ์ ์์ผ๋ฉด ๊ฐ์ ์ ์ ํ๋์ด ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ์ผ๋ถ๋ก ํ์ ๋จ. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ทธ ๊ฐ์ ์ ๋ฒ๋ฆผ
- ์ด๋ฐ ์์ผ๋ก n-1๋ฒ์ ์ฑ๊ณต์ ์งํฉ ํฉ์น๊ธฐ๊ฐ ์ด๋ฃจ์ด์ง ๋๊น์ง ์งํ
ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ๊ณผ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ
- ๋ ์๊ณ ์ง๋ฆ์ ์ฌ์ค ํ ๊ฐ์ง ์๋ฆฌ๋ฅผ ๋ฐํ์ผ๋ก ํจ
- n-1๊ฐ์ ๊ฐ์ ์ ๋ํด๊ฐ๋ ์์๋ฅผ ๋๋ฆ๋๋ก ์ ํด์ค
- ์ด๋ ๊ฒ ๋ํด๋๊ฐ๋ ๊ฐ์ ์ด ๊ถ๊ทน์ ์ผ๋ก ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ์ด๋ฅด๋ ๊ธธ์ ๋์น์ง ์์, ํด๋น ๊ฐ์ ์ ์ผ๋จ ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ํฌํจ์ํค๋ ๊ฒ์ด ์์ ํ๋ค๋ ๊ฒ์ ์๋ฏธ
์ฐธ๊ณ ์๋ฃ : ใ์ฝ๊ฒ ๋ฐฐ์ฐ๋ ์๋ฃ๊ตฌ์กฐ with ์๋ฐใ
(+)
์ ๋์จ ํ์ธ๋(Union-Find) ์๊ณ ๋ฆฌ์ฆ
- ์ฃผ๋ก ๋ ์์๊ฐ ๊ฐ์ ์งํฉ์ ์ํ๋์ง ๋น ๋ฅด๊ฒ ํ๋จํ๊ณ , ๋ ์งํฉ์ ํฉ์น๋ ๋ฐ ์ฌ์ฉ๋จ
- ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฃผ๋ก ๊ทธ๋ํ์์ ์ฐ๊ฒฐ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ฐพ๊ฑฐ๋, ์ฌ์ดํด์ด ์๋์ง ๊ฒ์ฌํ ๋ ์ฌ์ฉํจ
- Find : ์ด๋ค ์์๊ฐ ์ํ ์งํฉ์ ๋ํ(๋ฃจํธ)๋ฅผ ์ฐพ๊ธฐ
- Union : ๋ ์งํฉ์ ํ๋์ ์งํฉ์ผ๋ก ํฉ์น๊ธฐ
- [๊ตฌํ ๋ฐฉ๋ฒ]
- ์ด๊ธฐํ
- ๊ฐ ์์์ ๋ถ๋ชจ๋ฅผ ์๊ธฐ ์์ ์ผ๋ก ์ค์ . ์ด ๋, ๊ฐ ์์๋ ์์ ๋ง์ ํฌํจํ๋ ์งํฉ์ ๋ํ(๋ฃจํธ)
- Find ์ฐ์ฐ
- ํน์ ์์์ ๋ฃจํธ๋ฅผ ์ฐพ๊ธฐ ์ํด, ๋ถ๋ชจ ์์๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉด์ ๋ฃจํธ๋ฅผ ์ฐพ๊ธฐ
- ๊ฒฝ๋ก ์์ถ(Path Compression)์ ์ฌ์ฉํ์ฌ, Find ์ฐ์ฐ ๋์ค ๋ง๋๋ ๋ชจ๋ ์์์ ๋ถ๋ชจ๋ฅผ ๋ฃจํธ๋ก ์ง์ ์ฐ๊ฒฐ(๋ค์ ๋ฒ Find ์ฐ์ฐ์ด ๋ ๋นจ๋ผ์ง)
- Union ์ฐ์ฐ
- ๋ ์์์ ๋ฃจํธ๋ฅผ ์ฐพ๊ธฐ
- ๋ ๋ฃจํธ๊ฐ ๋ค๋ฅด๋ฉด, ํ ๋ฃจํธ๋ฅผ ๋ค๋ฅธ ๋ฃจํธ์ ์์์ผ๋ก ๋ง๋ค๊ธฐ(๋ ์งํฉ์ ํ๋๋ก ํฉ์ณ์ง)
- ์ด๊ธฐํ
//์์ ์ฝ๋
class UnionFind {
private int[] parent;
public UnionFind(int size) {
parent = new int[size];
for (int i = 0; i < size; i++) {
parent[i] = i;
}
}
public int find(int x) {
if (x == parent[x]) {
return x;
}
return parent[x] = find(parent[x]); // ๊ฒฝ๋ก ์์ถ
}
public void union(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY) {
parent[rootY] = rootX;
}
}
public boolean isConnected(int x, int y) {
return find(x) == find(y);
}
}
'๐๏ธ ์๋ฃ๊ตฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ > ์๊ณ ๋ฆฌ์ฆ,์๋ฃ๊ตฌ์กฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ทธ๋ํ] ์์ ์ ๋ ฌ, ์ต๋จ ๊ฒฝ๋ก (1) | 2023.12.08 |
---|---|
[๊ทธ๋ํ] ๋๋น์ฐ์ ํ์ BFS & ๊น์ด์ฐ์ ํ์ DFS (1) | 2023.12.08 |
[๊ทธ๋ํ] ๊ทธ๋ํ ํํ๋ฐฉ๋ฒ (2) | 2023.12.08 |
[ํด์ ํ ์ด๋ธ] ์ถฉ๋ ํด๊ฒฐ (2) | 2023.12.08 |
[ํด์ ํ ์ด๋ธ] ํด์ ํ ์ด๋ธ, ํด์ ํจ์ (0) | 2023.11.30 |