์ต์ ์ ์ฅ ํธ๋ฆฌ(MST)์ Kruskal ์๊ณ ๋ฆฌ์ฆ, Prim ์๊ณ ๋ฆฌ์ฆ
์ต์ ์ ์ฅ ํธ๋ฆฌ(Mimimum Spanning Tree)
- ์ ์ฅ ํธ๋ฆฌ : n๊ฐ์ ์ ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฌดํฅ ๊ทธ๋ํ์์ n๊ฐ์ ์ ์ ๊ณผ n-1๊ฐ์ ๊ฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ํธ๋ฆฌ
- ์ต์ ์ ์ฅ ํธ๋ฆฌ : ๋ฌดํฅ ๊ฐ์ค์น ๊ทธ๋ํ์์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฐ์ ๋ค์ ๊ฐ์ค์น ํฉ์ด ์ต์์ธ ์ ์ฅ ํธ๋ฆฌ
Kruskal ์๊ณ ๋ฆฌ์ฆ
๊ฐ์ ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ค์น๊ฐ ์์ ๊ฐ์ ์ ์ฐ์ ์ ์ผ๋ก ์ ํํ๋ฉฐ MST๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ
๋ก์ง ๐
- ์ต์ด์ ๋ชจ๋ ๊ฐ์ ์ ๊ฐ์ค์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค.
- ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ๋ฎ์ ๊ฐ์ ๋ถํฐ ์ ํํด๊ฐ๋ฉฐ ํธ๋ฆฌ๋ฅผ ์ฆ๊ฐ์ํจ๋ค.(์ด๋, ์ฌ์ดํด์ด ์กด์ฌํ๋ฉด ๋ค์์ผ๋ก ๊ฐ์ค์น๊ฐ ๋ฎ์ ๊ฐ์ ์ ์ ํํ๋ค.)
- n-1๊ฐ์ ๊ฐ์ ์ด ์ ํ๋ ๋๊น์ง ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- ๊ทธ๋ฆฌ๋ํ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐ
union-find
์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ฝ๊ฒ ๊ตฌํํ ์ ์์
Java
class MSTKruskal {
static int V, E; // ์ ์ , ๊ฐ์ ๊ฐ์
static Edge[] edgeList; // ๊ฐ์ ๋ฆฌ์คํธ
static int[] parents; // ์๋ก์ ์งํฉ์ ์ํ parents ๋ฐฐ์ด
// ๊ฐ์ ์ ํํํ ํด๋์ค
static class Edge implements Comparable<Edge> {
int from, to, weight; // ์ถ๋ฐ ๋
ธ๋, ๋์ฐฉ ๋
ธ๋, ๊ฐ์ค์น
public Edge(int from, int to, int weight) {
super();
this.from = from;
this.to = to;
this.weight = weight;
}
// ๊ฐ์ค์น ๊ธฐ์ค ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
@Override
public int CompareTo(Edge e) {
return Integer.compare(this.weight, e.weight); // ์์ ๊ฐ์ค์น ์ธ๋ํ๋ก์ฐ ์ฃผ์
}
}
// union-find์ make-set
private static void makeSet() {
parents = new int[V];
for (int i=0; i<V; i++) parents[i] = i;
}
// union-find์ find-set
private static int findSet(int a) {
if (parnets[a] == a) return a;
return parents[a] = findSet(parents[a]);
}
// union-find์ union
private static boolean union(int a, int b) {
int aRoot = findSet(a);
int bRoot = findSet(b);
if (aRoot == bRoot) return false;
parents[bRoot] = aRoot;
return true;
}
public static void main(String[] args) {
edgeList = new Edge[E];
for (int i=0; i<E; i++) edgeList[i] = new Edge(from, to, weight); // ๊ฐ์ ์ ๋ณด๋ฅผ ๊ฐ์ ๋ฆฌ์คํธ์ ์ ์ฅ
Arrays.sort(edgeList); // ๊ทธ๋ฆฌ๋ํ๊ฒ ์ต์ ๋น์ฉ ๊ฐ์ ์ ๋จผ์ ์ ํํ ๊ฒ์ด๋ฏ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
makeSet(); // ๋ชจ๋ ๊ฐ์ ์ ํ๋์ฉ ์ ํํด๋ณด๊ธฐ์ํด ๊ฐ ๋
ธ๋๋ฅผ ์๋ก์ ์งํฉ์ผ๋ก ํํ
int accumEdge = 0; // ์ ํ๋ ๋์ ๊ฐ์ ์
int totalWeight = 0; // ์ด ๊ฐ์ค์น
for (Edge edge : edgeList) { // ๊ฐ์ค์น๊ฐ ์์ ๊ฐ์ ๋ถํฐ ์ ํํ๋ฉฐ
if (union(edge.from, edge.to)) { // ๋ ์ ์ ๊ฐ ์ฌ์ดํด์ด ์กด์ฌํ์ง ์๋๋ค๋ฉด
totalWeight += edge.weight; // ํด๋น ๊ฐ์ ์ ์ ํ
if (++accumEdge >= V-1) break; // ๋ชจ๋ ์ ์ ์ด ์ฐ๊ฒฐ๋๋ฉด ์ข
๋ฃ
}
}
}
}
Prim ์๊ณ ๋ฆฌ์ฆ
์ ์ ์ ๊ธฐ์ค์ผ๋ก ํด๋น ์ ์ ์ ์ฐ๊ฒฐ๋ ๊ฐ์ ๋ค ์ค ๊ฐ์ค์น๊ฐ ์์ ๊ฐ์ ์ ์ฐ์ ์ ์ผ๋ก ์ ํํ๋ฉฐ MST๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ
๋ก์ง ๐
- ์์์ ์ ์ ์ ํ๋ ์ ํํ์ฌ ์์ํ๋ค.
- ์ ํํ ์ ์ ๊ณผ ์ธ์ ํ๋ ์ ์ ๋ค ์ค ์ต์ ๋น์ฉ์ ๊ฐ์ ์ด ์กด์ฌํ๋ ์ ์ ์ ์ ํํ๋ค.
- ๋ชจ๋ ์ ์ ์ด ์ ํ๋ ๋๊น์ง ์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- ๊ทธ๋ฆฌ๋ํ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐ
- ์ต์ ํ(์ฐ์ ์์ ํ)์ ์ด์ฉํ์ฌ ์ต์ ํ ๊ฐ๋ฅ
Java
class MSTPrim {
public static void main(String[] args) {
int N; // ์ ์ ๊ฐ์
int[][] adjLMatrix = new int[N][N]; // ๋ชจ๋ ์ธ์ ์ ์ ๊ฐ ๊ฐ์ค์น ์ ๋ณด ์ ์ฅ
boolean visited = new boolean[N]; // ์ ์ ๋ฐฉ๋ฌธ ์ฌ๋ถ
int[] minEdge = new int[N]; // ๊ฐ ๋
ธ๋ ๋ณ ๊ฐ์ ๊ฐ์ค์น ์ต์๊ฐ ์ ์ฅ
for (int i=0; i<N; i++) {
for (int j=0; j<N; j++) adjMatrix[i][j] = w; // ์ธ์ ์ ์ ๊ฐ ๊ฐ์ค์น ์ ์ฅ
minEdge[i] = Integer.MAX_VALUE; // ์ต์๊ฐ์ ์ํด ์ต๋๊ฐ์ผ๋ก ์ด๊ธฐํ
}
int totalWeight = 0; // ์ต์ข
์ต์ ์ ์ฅ ํธ๋ฆฌ ๋น์ฉ
minEdge[0] = 0; // 0๋ฒ ์ธ๋ฑ์ค ๋
ธ๋๋ถํฐ ์์ ์ค์ (์์์ ๋
ธ๋)
for (int i=0; i<N; i++) {
// 1) ์ ์ฅํธ๋ฆฌ์ ํฌํจ๋์ง ์์ ์ ์ ์ค ์ต์ ๊ฐ์ ๋น์ฉ์ ์ ์ ์ ์ฐพ๊ธฐ
int minWeight = Integer.MAX_VALUE; // ์ต์ ๊ฐ์ ๋น์ฉ
int minVertex = -1; // ์ต์ ๊ฐ์ ๋น์ฉ ๋
ธ๋
for (int j=0; j<N; j++) {
if (!visited[j] && minEdge[j]<minWeight) { // ๋ฐฉ๋ฌธํ์ง ์์๊ณ , ์ต์ ๊ฐ์ ๋น์ฉ์ด๋ฉด ์ ์ฅ
minWeight = minEdge[j];
minVertex = j;
}
}
visited[minVertex] = true; // ํด๋น ์ ์ ์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ์ ์ถ๊ฐํ๊ณ
totalWeight += minWeight; // ์ต์ข
์ต์ ๊ฐ์ ๋น์ฉ ํฉ์ฐ
// 2) ์ ํ๋ ์ ์ ๊ธฐ์ค์ผ๋ก ์ ์ฅ ํธ๋ฆฌ์ ์ฐ๊ฒฐ๋์ง ์์ ํ ์ ์ ๊ณผ์ ๊ฐ์ ๋น์ฉ์ ์ต์๊ฐ์ผ๋ก ์
๋ฐ์ดํธ
for (int j=0; j<N; j++) {
if (!visited && adjMatrix[minVertex][j] && adjMatrix[minVertex][j]<minEdge[j]) { // ๋ฐฉ๋ฌธํ์ง ์์๊ณ , minVertex์ ์ธ์ ํ๋ฉฐ, minVertex์์ ๊ฐ์ ๋น์ฉ์ด ๊ธฐ์กด ์ต์ ๊ฐ์ ๋น์ฉ๋ณด๋ค ์์ผ๋ฉด
minEdge[j] = adjMatrix[minVertex][j]; // minVertex์์ ๊ฐ์ ๋น์ฉ์ผ๋ก ์
๋ฐ์ดํธ(์ต์๊ฐ ๊ฐฑ์ )
}
}
}
}
}
Kruskal ์๊ณ ๋ฆฌ์ฆ Vs Prim ์๊ณ ๋ฆฌ์ฆ
๊ณตํต์
- MST ์๊ณ ๋ฆฌ์ฆ(ํธ๋ฆฌ์ ๋ชจ๋ ์ ์ (n๊ฐ ์ ์ )์ด ์ฐ๊ฒฐ๋ ์ ์๋ ๊ฐ์ ๋ค(n-1๊ฐ ๊ฐ์ ) ์ ๋น์ฉ์ ์ต์ ํฉ์ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ)
- ์ต์ ๋น์ฉ์ ๋ณด์ฅ
- ๋ ์๊ณ ๋ฆฌ์ฆ ๋ชจ๋ ๊ทธ๋ฆฌ๋ํ๊ฒ ํ์ฌ ์ํฉ์์ ์ ํํ ์ ์๋ ์ต์ ๋น์ฉ์ ์ต์ข ๋น์ฉ์ ๋ฐ์
์ฐจ์ด์
-
ํฌ๋ฃจ์ค์นผ
- ๊ฐ์ ๊ธฐ์ค ๋น์ฉ ๊ณ์ฐ
- ๋ชจ๋ ๊ฐ์ ์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ ํด๋น ๊ฐ์ ์ ์ฑํํ์ ๋ ๋ชจ๋ ์ ์ ์ด ์ ํ๋๋ค๋ฉด ์ต์ ๋น์ฉ์ ๊ณ์ฐํ ๊ฒ
-
ํ๋ฆผ
- ์ ์ ๊ธฐ์ค ๋น์ฉ ๊ณ์ฐ
- ์์์ ์์ ์ ์ ์ ์ ํํ์ฌ ์ต์ข ์ผ๋ก ์์ฑ๋ ํ๋์ MST์ ๊ฐ ์ ์ ์ ํ๋์ฉ ์ถ๊ฐํด๊ฐ๋๋ฐ ๋๋ ์ต์ ๋น์ฉ์ ์ ํ