- ์๋ก์ ์งํฉ(disjoint sets)๋ ๊ณตํต ์์๊ฐ ์๋ ๋ ์งํฉ์ ์๋ฏธ
- ์๋ก์ ๋ถ๋ถ ์งํฉ๋ค๋ก ๋๋์ด์ง ์์๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ
- ํฉ์งํฉ(Union) : ๋๊ฐ์ ์์๊ฐ ํฌํจ๋ ์งํฉ์ ํ๋์ ์งํฉ์ผ๋ก ํฉ์น๋ ์ฐ์ฐ
- ์ฐพ๊ธฐ (find) : ํน์ ํ ์์๊ฐ ์ํ ์งํฉ์ด ์ด๋ค ์งํฉ์ธ์ง ์๋ ค์ฃผ๋ ์ฐ์ฐ
- click
- ํฉ์งํฉ(Union) ์ฐ์ฐ์ ํ์ธํ์ฌ ์๋ก ์ฐ๊ฒฐ๋ ๋ ๋
ธ๋ A,B๋ฅผ ํ์ธ
- A์ B์ ๋ฃจํธ๋
ธ๋ A', B'๋ฅผ ๊ฐ๊ฐ ์ฐพ๋๋ค
- A'๋ฅผ B'์ ๋ถ๋ชจ ๋
ธ๋๋ก ์ค์ ํ๋ค
- ๋ชจ๋ ํฉ์งํฉ(Union) ์ฐ์ฐ์ ์ฒ๋ฆฌํ ๋๊น์ง 1๋ฒ์ ๊ณผ์ ์ ๋ฐ๋ณต
parent = new int[V+1];
for (int i = 1; i <= V; i++) {
parent[i] = i; // ์๊ธฐ์์ ๊ฐ๋ฆฌํค๊ธฐ
}
- parent[x] = y; // x๋ฒ ๋
ธ๋์ ๋ถ๋ชจ๋ y๋
ธ๋ ๋ผ๋ ์๋ฏธ
- ํฉ์งํฉ ์ฐ์ฐ์ด ํธํฅ๋๊ฒ ์ด๋ฃจ์ด์ง๋ ๊ฒฝ์ฐ ์ฐพ๊ธฐ ํจ์๊ฐ ๋นํจ์จ์ ์ผ๋ก ๋์ (์ต์
O(V))
- ๊ฒฝ๋ก ์์ถ(Path Compression) ์ ์ด์ฉ, ๋ถ๋ชจ ํ
์ด๋ธ ๊ฐ์ ๋ฐ๋ก ๊ฐฑ์
public static int find (int x) {
if (x == parent[x]) {
return x;
} else {
return parent[x] = find(parent[x]); // ๋ถ๋ชจ๊ฐ์ด ๋ฃจํธ๊ฐ ๋ ์ ์๋๋ก
}
}
- ๋ ํฐ ๋
ธ๋๊ฐ ์์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด ๊ดํ (1)<-(4)
public static void union (int x, int y) {
x = find(x);
y = find(y);
// ๋ ํฐ ๋
ธ๋๊ฐ ์์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด ๊ดํ
if (x < y) {
parent[y] = x;
} else {
parent[x] = y;
}
/*
// ๊ฐ๋จํ ํํ
if (x != y) {
parent[y] = x;
}
*/
}