Union๊ณผ find๋ ์งํฉ๊ณผ ๊ด๋ จ๋ ์ฐ์ฐ์ด๋ค.
- Union : ์ฌ๋ฌ ๋ ธ๋๊ฐ ์์ ๋ ํน์ 2๊ฐ์ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํด 1๊ฐ์ ์งํฉ์ผ๋ก ๋ฌถ๋ ์ฐ์ฐ
- find : ๋ ๋ ธ๋๊ฐ ๊ฐ์ ์งํฉ์ ์ํด ์๋ ์ง๋ฅผ ํ์ธํ๋ ์ฐ์ฐ
์ฝ๋ ์์์์ ๊ตฌํ ๋ฐฉ๋ฒ๋ ์ด๋ ต์ง ์๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ ๋์จ๊ณผ ํ์ธ๋๋ฅผ ๊ตฌํํ๊ธฐ ์ํด 1์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค.
์ด๊ธฐ์๋ ์๋ฌด ๋ ธ๋๋ ์ฐ๊ฒฐ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ ๋ ธ๋๊ฐ ๋ํ๋ ธ๋๊ฐ ๋๋ฉฐ ์์ ์ ์ธ๋ฑ์ค ๊ฐ์ผ๋ก ์ด๊ธฐํ ๋๋ค.
union์ ๋ ๋ ธ๋์ ๋ํ๋ ธ๋๋ฅผ ์ผ์น์ํค๋ ์ฐ์ฐ์ด๋ค.
์ด ๊ณผ์ ์์ ์ฌ๊ท์ ์ผ๋ก ๋ํ๋ ธ๋๋ฅผ ์ฐพ๋ ๊ณผ์ ์ด ํฌํจ๋ ์ ์๋ค.
find๋ ์์ ์ด ์ํ ์งํฉ์ ๋ํ๋ ธ๋๋ฅผ ์ฐพ๋ ์ฐ์ฐ์ด๋ค.
์ด ๊ณผ์ ์ด ์ค์ํ ์ด์ ๋ ๋จ์ํ ๋ ธ๋๋ฅผ ์ฐพ์ ๋ฟ๋ง ์๋๋ผ, ๊ทธ๋ํ๋ฅผ ์ ๋ํ๊ณ ์๊ฐ ๋ณต์ก๋๋ฅผ ํฅ์์ํค๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด, find์ ์ด๋ ํ ๊ณผ์ ์ด ๊ทธ๋ํ๋ฅผ ์ ๋ํ๊ณ ์๊ฐ๋ณต์ก๋๋ฅผ ํฅ์์ํฌ๊น?
> ๋ํ๋ ธ๋๋ฅผ ์ฐพ๋ ๊ณผ์ (์ฆ, ์ฌ๊ท ํจ์๋ฅผ ๊ฑฐ์น๋ฉฐ)์์ ๊ฐ ๋ ธ๋์ ๋ํ๋ ธ๋๋ฅผ ์ ์ผ ๋ง์ง๋ง์ ๋๋ฌํ๋ ๋ํ๋ ธ๋๋ก ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ๊ฒฐ๊ตญ ์ถํ์ ๋ํ๋ ธ๋๋ฅผ ์ฐพ๋ ์ฐ์ฐ ์๋๊ฐ O(1)๋ก ๋ฐ๋๋ ๊ฒฝ๋ก ์์ถ์ ํจ๊ณผ๋ก๋๋ฌ๋๋ค.
๋ฌธ์ ๋ฅผ ํตํด ์ ๋์จ๊ณผ ํ์ธ๋๋ฅผ ๊ตฌํํด๋ณด์.
Union, Find ์์ ๋ฌธ์ 1
1717๋ฒ: ์งํฉ์ ํํ
์ด๊ธฐ์ $n+1$๊ฐ์ ์งํฉ $\{0\}, \{1\}, \{2\}, \dots , \{n\}$์ด ์๋ค. ์ฌ๊ธฐ์ ํฉ์งํฉ ์ฐ์ฐ๊ณผ, ๋ ์์๊ฐ ๊ฐ์ ์งํฉ์ ํฌํจ๋์ด ์๋์ง๋ฅผ ํ์ธํ๋ ์ฐ์ฐ์ ์ํํ๋ ค๊ณ ํ๋ค. ์งํฉ์ ํํํ๋ ํ๋ก๊ทธ๋จ์ ์
www.acmicpc.net
ํด๋น ๋ฌธ์ ๋ ์ต๋ ์์ ๊ฐ์๊ฐ 1,000,000์ด๊ณ , ์ง์ ๊ฐ์๊ฐ 100,000์ผ๋ก ํฐ ํธ์ด๋ค. ๊ทธ๋์ ๊ฒฝ๋ก ์์ถ์ด ํ์ํ ๋ํ์ ์ธ ์ ๋์จ ํ์ธ๋ ๋ฌธ์ ๋ผ๊ณ ํ ์ ์๋ค.
import java.util.*;
import java.io.*;
public class Main {
public static int[] parent;
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
parent = new int[N+1];
for(int i=0; i<=N; i++) {
parent[i] = i;
}
for(int i=0; i<M; i++) {
int question = sc.nextInt();
int a = sc.nextInt();
int b = sc.nextInt();
if (question == 0) {
union(a, b);
} else {
if (checkSame(a, b)) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
}
public static void union(int a, int b) {
a = find(a);
b = find(b);
if (a != b) {
parent[b] = a;
}
}
public static int find(int a) {
if (a == parent[a]) {
return a;
} else {
return parent[a] = find(parent[a]);
}
}
public static boolean checkSame(int a, int b) {
a = find(a);
b = find(b);
if (a == b) {
return true;
}
return false;
}
}
- parent๋ผ๋ 1์ฐจ์ ๋ฐฐ์ด์ ํตํด ๋ํ๋ ธ๋์ ๊ด๋ จํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
- parent[i] = i๋ฅผ ์ ์ฅํจ์ผ๋ก์จ, ์ด๊ธฐ์ ๋ํ๋ ธ๋๋ฅผ ์๊ธฐ ์์ ์ผ๋ก ์ด๊ธฐํํ๋ค.
- union ํจ์๋ ๊ฐ ๋ ธ๋์ ๋ํ ๋ํ๋ ธ๋๋ฅผ ์ฐพ๊ณ , ๊ฐ์ง ์์ ์์ ๊ฐ๋๋ก ํด์ค๋ค.
- find ํจ์๋ ๋ํ๋ ธ๋๊ฐ ์๊ธฐ ์์ ์ธ๋ฑ์ค์ ๊ฐ์ ๋๋ ์ด๊ธฐํ๋ ์ํ ๊ทธ๋๋ก ์ด๋ฏ๋ก ์ธ๋ฑ์ค๋ฅผ ๋ฆฌํดํด์ฃผ์ง๋ง, ์๋ ๊ฒฝ์ฐ์๋ find ํจ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ์ฌ ๋ํ๋ ธ๋๋ฅผ ์ฐพ๋๋ค. ์ด ๊ณผ์ ์์, parent[a] ์ ์ฌ๊ทํจ์์ ๋ฆฌํด๊ฐ์ ์ฃผ์ด ๊ฒฝ๋ก ์์ถ์ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
Union, Find ์์ ๋ฌธ์ 2
1976๋ฒ: ์ฌํ ๊ฐ์
๋ํ์ด๋ ์น๊ตฌ๋ค๊ณผ ํจ๊ป ์ฌํ์ ๊ฐ๋ ค๊ณ ํ๋ค. ํ๊ตญ์๋ ๋์๊ฐ N๊ฐ ์๊ณ ์์์ ๋ ๋์ ์ฌ์ด์ ๊ธธ์ด ์์ ์๋, ์์ ์๋ ์๋ค. ๋ํ์ด์ ์ฌํ ์ผ์ ์ด ์ฃผ์ด์ก์ ๋, ์ด ์ฌํ ๊ฒฝ๋ก๊ฐ ๊ฐ๋ฅํ ๊ฒ์ธ
www.acmicpc.net
ํด๋น ๋ฌธ์ ๋ ๋์์ ์ฐ๊ฒฐ ์ ๋ฌด๋ฅผ ์ ๋์จ๊ณผ ํ์ธ๋๋ฅผ ์ด์ฉํด์ผ ํ๋ค๋ ์์ด๋์ด๋ฅผ ๋ ์ฌ๋ฆฌ๋ฉด ์ฝ๊ฒ ํ ์ ์๋ ๋ฌธ์ ์ด๋ค.
๋์์ ์์ ๋ํด์๋ ๋ํ๋ ธ๋ 1์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๊ณ , ์ธ์ ํ๋ ฌ์ ํ์ํ๋ฉด ๋๋ค.
import java.util.*;
import java.io.*;
public class Main {
public static int[] parent;
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
int[][] dosi = new int[N+1][N+1];
for(int i=1; i<=N; i++) {
for(int j = 1; j<=N; j++) {
dosi[i][j] = sc.nextInt();
}
}
int[] route = new int[M+1];
for(int i=1; i<=M; i++) {
route[i] = sc.nextInt();
}
parent = new int[N+1];
for(int i=1; i<=N; i++) {
parent[i] = i;
}
for(int i=1 ; i<=N; i++) {
for(int j=1; j<=N; j++) {
if (dosi[i][j] == 1) union(i, j);
}
}
int index = find(route[1]);
for(int i=2; i<route.length; i++) {
if (index != find(route[i])) {
System.out.println("NO");
return;
}
}
System.out.println("YES");
}
public static void union(int a, int b) {
a = find(a);
b = find(b);
if (a!=b) {
parent[b] = a;
}
}
public static int find(int a) {
if (a == parent[a]) {
return a;
} else {
return parent[a] = find(parent[a]);
}
}
}
- parent[i] = i๋ก ๋ํ๋ ธ๋๋ฅผ ์๊ธฐ ์์ ์ผ๋ก ์ด๊ธฐํ ์์ผ์ค๋ค.
- ์ธ์ ํ๋ ฌ์์ ๋์๊ฐ ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด, union์ ์คํํ๋ค. > union(i, j)
- ์ฌํ ๊ณํ ๋์๋ค์ด 1๊ฐ์ ๋ํ ๋์๋ก ์ฐ๊ฒฐ๋์ด ์๋ ์ง ํ์ธํ๋ค. index = find(route[1])
Union, Find ์์ ๋ฌธ์ 3
1043๋ฒ: ๊ฑฐ์ง๋ง
์ง๋ฏผ์ด๋ ํํฐ์ ๊ฐ์ ์ด์ผ๊ธฐ ํ๋ ๊ฒ์ ์ข์ํ๋ค. ํํฐ์ ๊ฐ ๋๋ง๋ค, ์ง๋ฏผ์ด๋ ์ง๋ฏผ์ด๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ์ด์ผ๊ธฐ๋ฅผ ํ๋ค. ์ง๋ฏผ์ด๋ ๊ทธ ์ด์ผ๊ธฐ๋ฅผ ๋งํ ๋, ์๋ ๊ทธ๋๋ก ์ง์ค๋ก ๋งํ๊ฑฐ๋ ์์ฒญ๋๊ฒ
www.acmicpc.net
import java.util.*;
import java.io.*;
public class Main {
static int[] parent;
static int[] trueP;
static ArrayList<Integer>[] party;
static int result;
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
int T = sc.nextInt();
result = 0;
trueP = new int[T];
for(int i=0; i<T; i++) {
trueP[i] = sc.nextInt();
}
party = new ArrayList[M];
for(int i=0; i<M; i++) {
party[i] = new ArrayList<Integer>();
int party_size = sc.nextInt();
for(int j=0; j<party_size; j++) {
party[i].add(sc.nextInt());
}
}
parent = new int[N+1];
for(int i=0; i<=N; i++) {
parent[i] = i;
}
for(int i=0; i<M; i++) {
int firstPeople = party[i].get(0);
for(int j=1; j<party[i].size(); j++) {
union(firstPeople, party[i].get(j));
}
}
for(int i=0; i<M; i++) {
boolean isPossible = true;
int cur = party[i].get(0);
for(int j=0; j<trueP.length; j++) {
if(find(cur) == find(trueP[j])) {
isPossible = false;
break;
}
}
if (isPossible) result++;
}
System.out.println(result);
}
public static void union(int a, int b) {
a = find(a);
b = find(b);
if (a != b) {
parent[b] = a;
}
}
public static int find(int a) {
if (a == parent[a]) {
return a;
} else {
return parent[a] = find(parent[a]);
}
}
}
- ์ง์ค์ ์๋ ์ฌ๋๋ค์ ๊ฐ๊ฐ ํ๋์ ์งํฉ์ผ๋ก ๋ณด์์ผ ํ๋ค.
- ๊ฐ ํํฐ์ ์ฐธ์ํ ์ฌ๋๋ค์ ๊ฐ์ ์งํฉ์ผ๋ก ๋ณด๊ณ , ์ง์ค์ ์๋ ์ฌ๋๋ค์ ์งํฉ์ ์ํด ์๋ ์ง ํ์ธํ๋ค.
- ๊ฐ ํํฐ์ ์ฐธ์ํ ์ฌ๋๋ค์ union์ ํตํด ๋ํ๋ ธ๋๋ฅผ ๊ฐ๊ฒ ๋ง๋ ๋ค.
- ์ง์ค์ ์๋ ์ฌ๋๋ค์ ์งํฉ๊ณผ ๊ฐ ํํฐ์ ์งํฉ์ ๋ํ๋ ธ๋๋ฅผ ๋น๊ตํ์ฌ, ๊ฐ ์ ์๋ ํํฐ์ธ ์ง ํ์ธํ๋ค.
Reference
- Do it! ์ฝ๋ฉ ํ ์คํธ - ์ค์ ํธ
'๐ Knowledge > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] Biconnect Component : ์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ (0) | 2023.10.12 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ์์ ์ ๋ ฌ์ ์ดํดํด๋ณด์. (1) | 2023.10.12 |
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ํ ์ ํ์ ๊ทธ๋ํ ๋ฌธ์ ๋ค (1) | 2023.09.04 |
[์๊ณ ๋ฆฌ์ฆ] ์ ์๋ก - ์ค์ผ๋ฌ ํผ์ ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ (0) | 2023.09.01 |
[์๊ณ ๋ฆฌ์ฆ] ์ ์๋ก - ์์์ ๊ดํ์ฌ (0) | 2023.08.30 |