https://www.acmicpc.net/problem/1717
π§© μλ°λ‘ νΈλ μ§ν©μ νν λ¬Έμ νμ΄
π λ¬Έμ κ°μ
λ°±μ€ 1717λ² μ§ν©μ νν λ¬Έμ λ Disjoint Set(μλ‘μ μ§ν©) μλ£κ΅¬μ‘°μ κΈ°λ³Έ λμμΈ Findμ Unionμ ꡬννλ λνμ μΈ λ¬Έμ μ λλ€.
- μ°μ° μ’
λ₯
- 0 a b : aμ bκ° μν μ§ν©μ ν©μΉλ€.
- 1 a b : aμ bκ° κ°μ μ§ν©μ ν¬ν¨λμ΄ μλμ§ νμΈνλ€.
π‘ μμ μ λ ₯
7 8
0 1 3
1 1 7
0 7 6
1 7 1
0 3 7
0 4 2
0 1 1
1 1 1
μμ μΆλ ₯:
NO
NO
YES
π§ μκ³ λ¦¬μ¦ μ κ·Ό λ°©μ
- ν΅μ¬μ Union-Find μκ³ λ¦¬μ¦μ λλ€.
- κ° μμλ μμ μ΄ μν μ§ν©μ λν(parent)λ₯Ό κ°λ¦¬ν΅λλ€.
- find(x)λ₯Ό ν΅ν΄ λνλ₯Ό μ°Ύκ³ , union(x, y)λ₯Ό ν΅ν΄ λ μ§ν©μ λ³ν©ν©λλ€.
- findμλ **κ²½λ‘ μμΆ(Path Compression)**μ μ μ©ν΄ μκ° λ³΅μ‘λλ₯Ό μ€μ λλ€.
π§Ύ μ½λ ν΄μ€
import java.io.*;
import java.util.*;
public class Main {
static int n, m;
static int[] parent;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
parent = new int[n + 1];
for (int i = 0; i <= n; i++) parent[i] = i;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int op = Integer.parseInt(st.nextToken());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
if (op == 0) {
union(a, b);
} else {
sb.append(find(a) == find(b) ? "YES\n" : "NO\n");
}
}
System.out.print(sb);
}
static int find(int x) {
if (parent[x] != x) parent[x] = find(parent[x]);
return parent[x];
}
static void union(int a, int b) {
int rootA = find(a);
int rootB = find(b);
if (rootA != rootB) parent[rootB] = rootA;
}
}
β find ν¨μλ κ²½λ‘ μμΆμ μ΄μ©ν΄ λΆλͺ¨λ₯Ό μ¬κ·μ μΌλ‘ μ΅μμ 루νΈλ‘ κ°±μ ν©λλ€.
β union ν¨μλ λ μμμ 루νΈλ₯Ό μ°Ύμμ λ³ν©ν©λλ€.
β μ λ ₯μ΄ λ§κΈ° λλ¬Έμ BufferedReaderμ StringBuilderλ₯Ό μ¬μ©νμ¬ μ μΆλ ₯ μ±λ₯μ μ΅μ νν©λλ€.
π― κ²°λ‘
μ΄ λ¬Έμ λ Union-Find μκ³ λ¦¬μ¦μ μ°μ΅νκΈ°μ κ°μ₯ μ ν©ν λ¬Έμ μ λλ€.
νΉν κ²½λ‘ μμΆ μμ΄ νλ©΄ μκ° μ΄κ³Όκ° λ°μνλ―λ‘, find()μ κΌ μ΅μ νλ₯Ό μ μ©ν΄μΌ ν©λλ€.
ππΌ μλ‘μ μ§ν© λ¬Έμ λ₯Ό ν λλ νμ λ€μ λ κ°μ§λ₯Ό μΌλμ λμ:
- find()μλ κ²½λ‘ μμΆμ!
- union()μλ λνλ Έλ λ³ν©μ!
'Algorithm & Data Structures > BOJ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
b4195. μΉκ΅¬λ€νΈμν¬ (0) | 2025.05.08 |
---|---|
b1976. μ¬νκ°μ (0) | 2025.05.06 |
b4803. νΈλ¦¬ (0) | 2025.04.28 |
b2263. νΈλ¦¬μ μν (0) | 2025.04.28 |
b11780. νλ‘μ΄λ 2 (0) | 2025.04.25 |