
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ (Kruskal's Algorithm)

ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋ํ ๋ด์ ๋ชจ๋ ์ ์ ์ ๊ฐ์ฅ ์ ์ ๋น์ฉ์ผ๋ก ์ฐ๊ฒฐํ๋ ์ต์ ์ ์ฅ ํธ๋ฆฌ(Minimun Spanning Tree; MST)๋ฅผ ๊ตฌํ๋ ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ ์ ๋๋ค.
์ ์ฅ ํธ๋ฆฌ(Spanning Tree)
๊ทธ๋ํ์ ๋ชจ๋ ์ ์ ์ ํฌํจํ๋ฉด์, ์ฌ์ดํด์ด ์๋ ๋ถ๋ถ ๊ทธ๋ํ
์ต์ ์ ์ฅ ํธ๋ฆฌ(Minimun Spanning Tree)
๊ฐ์ ์ ๊ฐ์ค์น ํฉ์ด ์ต์์ธ ์ ์ฅ ํธ๋ฆฌ
ํฌ๋ฃจ์ค์นผ ๋์ ์์ด๋์ด
๊ฐ์ค์น๊ฐ ๋ฎ์ ๊ฐ์ ๋ถํฐ ์์๋๋ก ์ ํํ๋, ์ฌ์ดํด์ ํ์ฑํ๋ ๊ฐ์ ์ ์ ์ธํ๋ค. ์ฌ์ดํด ํ๋ณ์๋ ์ ๋์จ-ํ์ธ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
- ๋ชจ๋ ๊ฐ์ ์ ๊ฐ์ค์น ๊ธฐ์ค ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
- ๊ฐ์ ๋ค์ ์์๋๋ก ํ์ธํ๋ฉด์
- ํด๋น ๊ฐ์ ์ด ์ฌ์ดํด์ ํ์ฑํ์ง ์์ผ๋ฉด(๋ ์ ์ ์ ๋ฃจํธ ๋ ธ๋๊ฐ ๋ค๋ฅด๋ฉด) -> MST์ ์ถ๊ฐ
- ์ฌ์ดํด์ ํ์ฑํ๋ฉด -> ๊ฑด๋๋
- MST์ ๊ฐ์ ์๊ฐ (์ ์ ์ -1)๊ฐ๊ฐ ๋๋ฉด ์ข ๋ฃ
ํฌ๋ฃจ์ค์นผ ๋์ ์์
[ ์์ ์ํ ]

์ด๋ฌํ ๊ทธ๋ํ๊ฐ ์๋ค๊ณ ํ์.
| i | A | B | C | D | E |
| p[i] | A | B | C | D | E |
[ ๊ฐ์ ์ ๋ ฌ ํ๊ธฐ ]
| v1 | v2 | w |
| A | B | 1 |
| C | E | 2 |
| A | C | 3 |
| B | C | 3 |
| C | D | 4 |
| D | E | 5 |
| B | D | 6 |
[ ๊ฐ์ ์ ํ : A - B ]

์ํํ์ง ์์ ๊ฐ์ ์ค ๊ฐ์ค์น๊ฐ 1๋ก ์ ์ผ ์์ A - B ๊ฐ์ ์ ์ ํ.
A์ B์ ๋ถ๋ชจ ์ ์ ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฌ์ดํด์ด ์๊ธฐ์ง ์์ผ๋ฏ๋ก MST์ ์ถ๊ฐ ๊ฐ๋ฅ
B์ ๋ถ๋ชจ ์ ์ ์ A๋ก ๊ฐฑ์
| i | A | B | C | D | E |
| p[i] | A | B -> A | C | D | E |
[ ๊ฐ์ ์ ํ : C - E ]

์ํํ์ง ์์ ๊ฐ์ ์ค ๊ฐ์ค์น๊ฐ 2๋ก ์ ์ผ ์์ C - E ๊ฐ์ ์ ์ ํ
C์ E์ ๋ถ๋ชจ ์ ์ ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฌ์ดํด์ด ๋ฐ์ํ์ง ์์ผ๋ฏ๋ก MST์ ์ถ๊ฐ ๊ฐ๋ฅ
E์ ๋ถ๋ชจ ์ ์ ์ C๋ก ๊ฐฑ์
| i | A | B | C | D | E |
| p[i] | A | A | C | D | E -> C |
[ ๊ฐ์ ์ ํ : A - C ]

์ํํ์ง ์์ ๊ฐ์ ์ค ๊ฐ์ค์น๊ฐ ์ ์ผ ์์ A - C ๊ฐ์ ์ ์ ํ
A์ C์ ๋ถ๋ชจ ์ ์ ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฌ์ดํด์ด ๋ฐ์ํ์ง ์์ผ๋ฏ๋ก MST์ ์ถ๊ฐ ๊ฐ๋ฅ
C์ ๋ถ๋ชจ ์ ์ ์ A๋ก ๊ฐฑ์
| i | A | B | C | D | E |
| p[i] | A | A | C -> A | D | C |
[ ๊ฐ์ ์ ํ B - C ]

์ํํ์ง ์์ ๊ฐ์ ์ค ๊ฐ์ค์น๊ฐ ์ ์ผ ์์ B - C ๊ฐ์ ์ ์ ํ
ํ์ง๋ง B์ C์ ๋ถ๋ชจ ์ ์ ์ด A๋ก ๊ฐ์ผ๋ฏ๋ก ์ฌ์ดํด์ด ๋ฐ์ํจ -> MST์์ ์ ์ธ
| i | A | B | C | D | E |
| p[i] | A | A | A | D | C |
[ ๊ฐ์ ์ ํ C - D ]

์ํํ์ง ์์ ๊ฐ์ ์ค ๊ฐ์ค์น๊ฐ ์ ์ผ ์์ C - D ๊ฐ์ ์ ์ ํ
C์ D์ ๋ถ๋ชจ ์ ์ ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฌ์ดํด์ด ๋ฐ์ํ์ง ์์ผ๋ฏ๋ก MST์ ์ถ๊ฐ ๊ฐ๋ฅ
D์ ๋ถ๋ชจ ์ ์ ์ C๋ก ๊ฐฑ์
[ ์ข ๋ฃ ]

์ ํธ๋ฆฌ๋ ๊ทธ๋ํ ๋ด์ ๋ชจ๋ ์ ์ ์ ํฌํจํ๊ณ ์๊ณ , (์ ์ ์ - 1)๊ฐ์ ๊ฐ์ ์ด MST์ ํฌํจ๋์ด ์์ผ๋ฏ๋ก
MST๋ฅผ ์์ฑํ๋ค๊ณ ํ ์ ์๋ค.
ํฌ๋ฃจ์ค์นผ - ์๋ฐ ์ฝ๋
2026.02.27 - [๐ค์๊ณ ๋ฆฌ์ฆ] - [์๊ณ ๋ฆฌ์ฆ] ๋ถ๋ฆฌ(์๋ก์) ์งํฉ - (Union-Find)
[์๊ณ ๋ฆฌ์ฆ] ๋ถ๋ฆฌ(์๋ก์) ์งํฉ - (Union-Find)
๋ถ๋ฆฌ ์งํฉ์ด๋?๋ถ๋ฆฌ ์งํฉ(Disjoint Set)์ ์๋ก ์ค๋ณต๋์ง ์๋ ๋ถ๋ถ ์งํฉ๋ค๋ก ๋๋์ด์ง ์์๋ค์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์กฐ์ํ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์๋ฏธํฉ๋๋ค. ๊ต์งํฉ์ด ์๋ ์งํฉ๋ค๋ก, ์งํฉ์ ์ํ ํ
yobi-devlog.tistory.com
import java.util.*;
class Edge implements Comparable<Edge> {
int v1, v2, weight;
public Edge(int v1, int v2, int weight) {
this.v1 = v1;
this.v2 = v2;
this.weight = weight;
}
@Override
public int compareTo(Edge o) {
return Integer.compare(this.weight, o.weight);
}
}
public class Main {
static int[] parent;
// Find ์ฐ์ฐ
public static int find(int x) {
if (parent[x] == x) return x;
return parent[x] = find(parent[x]);
}
// Union ์ฐ์ฐ
public static void union(int a, int b) {
a = find(a);
b = find(b);
if (a != b) parent[b] = a;
}
public static void main(String[] args) {
int V = 7; // ์ ์ ๊ฐ์
List<Edge> edges = new ArrayList<>();
// ๊ฐ์ ์ ๋ณด ์ถ๊ฐ (v1, v2, weight)
edges.add(new Edge(1, 2, 29));
edges.add(new Edge(1, 5, 75));
// ...
// 1. ๊ฐ์ค์น ๊ธฐ์ค ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
Collections.sort(edges);
// 2. ๋ถ๋ชจ ํ
์ด๋ธ ์ด๊ธฐํ
parent = new int[V + 1];
for (int i = 1; i <= V; i++) parent[i] = i;
int totalWeight = 0;
int edgeCount = 0;
for (Edge edge : edges) {
// 3. ์ฌ์ดํด์ด ๋ฐ์ํ์ง ์๋ ๊ฒฝ์ฐ์๋ง ์งํฉ์ ํฌํจ
if (find(edge.v1) != find(edge.v2)) {
union(edge.v1, edge.v2);
totalWeight += edge.weight;
edgeCount++;
if (edgeCount == V - 1) break;
}
}
System.out.println("์ต์ ๋น์ฉ: " + totalWeight);
}
}
ํฌ๋ฃจ์ค์นผ VS ํ๋ฆผ
2026.03.11 - [๐ค์๊ณ ๋ฆฌ์ฆ] - [์๊ณ ๋ฆฌ์ฆ] ํ๋ฆผ(Prim) ์๊ณ ๋ฆฌ์ฆ
[์๊ณ ๋ฆฌ์ฆ] ํ๋ฆผ(Prim) ์๊ณ ๋ฆฌ์ฆ
ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ (Prim Algorithm)ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋ํ ๋ด์ ๋ชจ๋ ์ ์ ์ ๊ฐ์ฅ ์ ์ ๋น์ฉ์ผ๋ก ์ฐ๊ฒฐํ๋ ์ต์ ์ ์ฅ ํธ๋ฆฌ(Minimum Spanning Tree; MST)๋ฅผ ๊ตฌํ๋ ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ ์ ๋๋ค. ์ ์ฅ ํธ๋ฆฌ(Spanning T
yobi-devlog.tistory.com
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ๊ณผ ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ ๋ชจ๋ ์ต์ ์ ์ฅ ํธ๋ฆฌ(MST)๋ฅผ ์ฐพ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ ์ ๋๋ค.
๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ชฉ์ ์ด ๊ฐ์ง๋ง, ์ ๊ทผ ๋ฐฉ์๊ณผ ์ฌ์ฉํ๋ ์๋ฃ๊ตฌ์กฐ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์
"๊ทธ๋ํ์ ํน์ฑ(๊ฐ์ ์ ๊ฐ์...)"์ ๋ฐ๋ผ ์ ์ ํ ์ ํํ ํ์๊ฐ ์์ต๋๋ค.
| ํฌ๋ฃจ์ค์นผ | ํ๋ฆผ | |
| ํ์ ๊ธฐ์ค | ๊ฐ์ ์ค์ฌ | ์ ์ ์ค์ฌ |
| ๋์ ๋ฐฉ์ | ๊ฐ์ค์น๊ฐ ๋ฎ์ ๊ฐ์ ๋ถํฐ ์ ํ | ํ๋์ ์ ์ ์์ ์ฐ๊ฒฐ๋ ์ ์ ์ ํ์ฅ |
| ํต์ฌ ์๋ฃ๊ตฌ์กฐ | ๋ถ๋ฆฌ ์งํฉ(Union - Find) | ์ฐ์ ์์ ํ |
| ์๊ฐ ๋ณต์ก๋ | $O(ElogE)$ | $O(ElogV)$ |
| ์ ๋ฆฌํ ๊ฒฝ์ฐ | ๊ฐ์ ์ด ์ ์ ํฌ์ ๊ทธ๋ํ | ๊ฐ์ ์ด ๋ง์ ๋ฐ์ง ๊ทธ๋ํ |
-> ๊ฐ์ (E)์ ๊ฐ์๊ฐ ์ ์ ์ ๋นํด ์ ์ ๊ฒฝ์ฐ : ๊ฐ์ ์ ๋ ฌ์ ์๊ฐ์ด ์ ๊ฒ ๋๋ฏ๋ก, ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ด ์ ๋ฆฌํฉ๋๋ค.
-> ๊ฐ์ ์ ๊ฐ์๊ฐ ๋ง์ ๊ฒฝ์ฐ : ๊ฐ์ ์ ๋ ฌ ๋น์ฉ์ด ์ปค์ง๊ธฐ ๋ผ๋ฌธ์ ์ ์ ์์ฃผ๋ก ํ์ํ๋ ํ๋ฆผ์ด ์ ๋ฆฌํฉ๋๋ค.
'๐ค์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [์๋ฃ๊ตฌ์กฐ] ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ (Segment Tree) (0) | 2026.03.11 |
|---|---|
| [์๊ณ ๋ฆฌ์ฆ] ํ๋ฆผ(Prim) ์๊ณ ๋ฆฌ์ฆ (0) | 2026.03.11 |
| [์๊ณ ๋ฆฌ์ฆ] ๋ถ๋ฆฌ(์๋ก์) ์งํฉ - (Union-Find) (0) | 2026.03.09 |
| [์๊ณ ๋ฆฌ์ฆ] ๋ค์ต์คํธ๋ผ (Dijkstra) (0) | 2026.02.25 |
| [์๋ฃ๊ตฌ์กฐ] ํธ๋ผ์ด(Trie) (0) | 2026.02.24 |
์ฌ์ฐ๋น์ ๊ฐ๋ฐ ๋ธ๋ก๊ทธ
https://www.youtube.com/watch?v=SVGTzOL357Y&list=RDSVGTzOL357Y&start_radio=1