์ต์ ์คํจ๋ ํธ๋ฆฌ(MST) ๋ฌธ์ ๋ ๋ณดํต ํฌ๋ฃจ์ค์นผ์ด๋ ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค๊ณ ํ๋ค.
- ํฌ๋ฃจ์ค์นผ : ๊ฐ์ ์์ฃผ๋ก ์๊ฐ. ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ๋ฎ์ ๊ฐ์ ์ ์ ํํ๊ฑฐ๋ ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ํฐ ๊ฐ์ ์ ์ ๊ฑฐํ๋ ๋ฐฉํฅ์ผ๋ก ๋ก์ง์ ๊ตฌํํ๋ค.
· ์๊ฐ๋ณต์ก๋๋ ๊ฐ์ ์ด e๊ฐ ์์ ๋ O(elogโe)
- ํ๋ฆผ : ๋ ธ๋ ์์ฃผ๋ก ์๊ฐ. ๋ ธ๋ ํ๋๋ฅผ ์ ํํ์ฌ ๊ทธ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ค ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ์์ ๊ฐ์ ์ ์ ํํด๊ฐ๋ ๋ฐฉํฅ์ผ๋ก ๋ก์ง์ ๊ตฌํํ๋ค.
· ์๊ฐ๋ณต์ก๋๋ ๋ ธ๋๊ฐ n๊ฐ ์์ ๋ O(n^2)
๋ ๋ค ๊ณตํต์ ์ธ ๊ฑด, ์ฌ์ดํด์ด ์๊ธฐ๋ฉด ์ ๋๊ธฐ ๋๋ฌธ์ ์ ๋์จ-ํ์ธ๋ ์๊ณ ๋ฆฌ์ฆ์ ์๊ณ ์์ด์ผ ํ๋ค๋ ๊ฒ.
์ด ๋ฌธ์ ๋ ๊ฐ์ค์น๊ฐ ๋ฎ์ ๊ฐ์ ์ ์ ํํด๊ฐ๋ ๋ฐฉ์์ผ๋ก ํ์๋ค.
๋ฐฉ๋ฒ 1. ๊ฐ ๊ฐ์ ๋ค์ ArrayList
์ ๋ด์์ Collections.sort
๋ฅผ ํ ๋ค์์ for-each
๋ฅผ ํตํด ๊ฐ์ ์ ํํ๋ ๋ฐฉ๋ฒ
๋ฐฉ๋ฒ 2. ๊ฐ ๊ฐ์ ๋ค์ PriorityQueue
์ ๋ด์์ while๋ฌธ
์ผ๋ก ๋ชจ๋ ๊ฐ์ ๋ค์ ์ฒดํฌํ๋ ๋ฐฉ๋ฒ
์๋ ์๋ ๋ฐฉ๋ฒ 1๋ก ํ์๊ณ , ์ด๋ฒ์๋ ๋ฐฉ๋ฒ 2๋ก ํ์๋๋ฐ ๋ฏธ์ธํ๊ฒ ๋ฐฉ๋ฒ 1์ด ์๋๊ฐ ๋น ๋ฅด๋ค.
/* 2021.01.05(ํ) */
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.PriorityQueue;
public class Main {
static int[] parent;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().trim().split(" ");
int V = Integer.parseInt(str[0]);
int E = Integer.parseInt(str[1]);
int total = 0;
parent = new int[V+1];
for(int i=0;i<=V;i++) parent[i] = i;
int start = 0, end = 0, weight = 0;
PriorityQueue<Edge> pq = new PriorityQueue<Edge>();
for(int i=0;i<E;i++) {
str = br.readLine().trim().split(" ");
start = Integer.parseInt(str[0]);
end = Integer.parseInt(str[1]);
weight = Integer.parseInt(str[2]);
pq.offer(new Edge(start, end, weight));
}
Edge currEdge;
while(!pq.isEmpty()) {
currEdge = pq.poll();
//์์ ๋
ธ๋์ ๋ ๋
ธ๋์ ๋ถ๋ชจ๊ฐ ๊ฐ๋ค๋ฉด ํด๋น ๊ฐ์ ์ ์ ํํด์ ๊ฒฝ๋ก๋ฅผ ๋ง๋ค์์ ๋,
//์ฌ์ดํด์ด ์์ฑ๋์ด ๋ฒ๋ฆฐ๋ค.
//--> ๋ถ๋ชจ๊ฐ ๊ฐ๋ค๋ฉด ๊ฐ์ ์ ์ ํํ์ง ์๊ณ ๊ทธ๋ฅ ๋์ด๊ฐ๋ค.
if(hasSameParent(currEdge.s, currEdge.e)) continue;
//์ฌ์ดํด์ด ์์ฑ๋์ง ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด, ํด๋น ๊ฐ์ ์ ์ ํํ๋ค.
//--> s์ e์ ๋ถ๋ชจ๋ฅผ ํฉ์ณ์ฃผ๊ณ , ๊ฐ์ค์น๋ฅผ total ๋ณ์์ ๋ํด์ค๋ค.
union(currEdge.s, currEdge.e);
total += currEdge.w;
}
System.out.println(total);
}
private static void union(int x, int y) {
x = find(x);
y = find(y);
//์์ ์ซ์์ parent๋ก ํต์ผ์์ผ์ฃผ๊ธฐ๋ก ํ์ผ๋๊น,
//์ต์ข
์ ์ผ๋ก ๋
ธ๋๋ค์ parent๊ฐ ์ ๋ถ 1์ผ ๊ฒ
//(1๋ถํฐ V๊น์ง ๋ชจ๋ ์ฐ๊ฒฐ์์ผ์ผ ํ๋๊น!)
if(x>y) parent[x] = y;
else parent[y] = x;
}
private static boolean hasSameParent(int s, int e) {
int sParent = find(s);
int eParent = find(e);
if(sParent==eParent) return true;
else return false;
}
private static int find(int x) {
if(parent[x]==x) return x;
return parent[x] = find(parent[x]);
}
static class Edge implements Comparable<Edge>{
int s;
int e;
int w;
public Edge(int s, int e, int w) {
this.s = s;
this.e = e;
this.w = w;
}
@Override
public int compareTo(Edge o) {
return this.w-o.w;
}
}
}
'์๊ณ ๋ฆฌ์ฆ > ๋ฌธ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋ฐ] ๋ฐฑ์ค 2042 - ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ (0) | 2021.01.06 |
---|---|
[์๋ฐ] ๋ฐฑ์ค 4386 - ๋ณ์๋ฆฌ ๋ง๋ค๊ธฐ (0) | 2021.01.05 |
[์๋ฐ] 2019 ์นด์นด์ค ๊ฐ๋ฐ์ ๊ฒจ์ธ ์ธํด์ญ - #3 ๋ถ๋ ์ฌ์ฉ์ (0) | 2021.01.02 |
[์๋ฐ] ๋ฐฑ์ค 1976 - ์ฌํ ๊ฐ์ (0) | 2021.01.02 |
[์๋ฐ] ๋ฐฑ์ค 1717 - ์งํฉ์ ํํ (0) | 2020.12.29 |