Tags
- Java
- Python
- BOJ
- ๊ตฌํ
- greedy
- queue
- ์ ๋ ฌ
- Dynamic Programming
- LV2
- ์ํ
- ๊ทธ๋ํ ์ด๋ก
- ์๋ฃ๊ตฌ์กฐ
- PGM
- ์ ์๋ก
- ๋๋น ์ฐ์ ํ์
- SpringBoot
- stack
- sort
- ๊น์ด ์ฐ์ ํ์
- ๋ฐฑํธ๋ํน
- Study
- dfs
- Brute Force Algorithm
- CodingTest
- ๋ฌธ์์ด
- ๊ทธ๋ํ ํ์
- DP
- BFS
- ๊ต์ฌ
- ์๋ฎฌ๋ ์ด์
Archives
๊ธฐ๋ก๋ฐฉ
BOJ_1197 : ์ต์ ์คํจ๋ ํธ๋ฆฌ ๋ณธ๋ฌธ
๐ธ ๋ฌธ์ ๋ถ์ ๐ธ
- ์ต์ ์ ์ฅ ํธ๋ฆฌ(MST, Minimum Spanning Tree)๋ฅผ ๊ตฌํํ๋ ๋ฌธ์ ์ด๋ค.
- ํฌ๋ฃจ์ค์นผ(Kruskal)๊ณผ ํ๋ฆผ(Prim) ์๊ณ ๋ฆฌ์ฆ์ด ์๋๋ฐ, ์ฌ๊ธฐ์๋ ํฌ๋ฃจ์ค์นผ์ ์ฌ์ฉํ๋ค.
๐ธ ๋ฌธ์ ํ์ด ๐ธ
- ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ณธ ํํ๋ฅผ ๊ตฌํํ๋ค.
- ๊ฐ์ ์ ๊ฐ์ค์น ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๊ธฐ ์ํด ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๋ค.
- ์ฌ์ดํด ๋ฐฉ์ง๋ฅผ ์ํด ๊ฐ์ ์งํฉ์ ํฌํจ๋์ด์๋์ง ํ์ธ์ด ํ์ํ๋ฏ๋ก Union-Find ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
๐ธ ์ฝ๋ ๐ธ
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
private static int[] parent;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine());
int V = Integer.parseInt(st.nextToken());
int E = Integer.parseInt(st.nextToken());
parent = new int[V + 1];
for (int i = 1; i <= V; i++) {
parent[i] = i;
}
PriorityQueue<Edge> pq = new PriorityQueue<>();
for (int i = 0; i < E; i++) {
st = new StringTokenizer(br.readLine());
pq.add(new Edge(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()),
Integer.parseInt(st.nextToken())));
}
int sum = 0;
while (!pq.isEmpty()) {
Edge edge = pq.poll();
if (union(edge.start, edge.end)) {
sum += edge.cost;
}
}
bw.write(Integer.toString(sum));
bw.flush();
}
private static boolean union(int a, int b) {
int ap = find(a);
int bp = find(b);
if (parent[ap] == parent[bp]) {
return false;
} else {
parent[bp] = parent[ap];
return true;
}
}
private static int find(int a) {
if (a == parent[a]) {
return a;
}
return parent[a] = find(parent[a]);
}
private static class Edge implements Comparable<Edge> {
int start, end, cost;
public Edge(int start, int end, int cost) {
this.start = start;
this.end = end;
this.cost = cost;
}
@Override
public int compareTo(Edge o) {
return this.cost - o.cost;
}
}
}
๐ธ ์ฝ๋ ํด์ ๐ธ
- ๊ฐ์ ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ , ์ฐ์ ์์ ํ์์ ์ ๋ ฌํ๊ธฐ ์ํด Edge ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ค.
- Union-Find ์๊ณ ๋ฆฌ์ฆ์ ์ํด union๊ณผ find ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๊ตฌํํ๋ค.
- ์ฐ์ ์์ ํ์ ์์๊ฐ ๋จ์ง ์์ ๋ ๊น์ง ๊ณ์ฐ์ ๋ฐ๋ณตํ๋ค.
- ๊ฐ์ ์งํฉ์ด ์๋๋ผ๋ฉด, ํ๋์ ์งํฉ์ผ๋ก ํฉ์ณ์ฃผ๊ณ ๊ฐ์ค์น๋ฅผ ๋์ ํ๋ค.
- ์ต์ข ๋์ ๋ ๊ฐ์ค์น๋ฅผ ์ถ๋ ฅํ๋ค.
๐ธ end ๐ธ
- ์ค๋๋ง์ MST ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์๋๋ฐ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์ฐ์ ์์ ํ๊ฐ ์ ์ฉ๋๋๊ฑด ๊ธฐ์ตํ์ง๋ง, Union-Find๊ฐ ์ฌ์ฉ๋๋๊ฒ ๊ธฐ์ต ์๋์ ์๊ณ ๋ฆฌ์ฆ ์ค๋ช
์ ๋ค์ ์ฝ์ด๋ณด์๋ค.
- MST ๊ด๋ จ ๋ฌธ์ ๋ฅผ ๋ ์ฐ์ตํ ํ์๊ฐ ์์ ๊ฒ ๊ฐ๊ณ , ๋ค์์ Prim ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด๋ด์ผ๊ฒ ๋ค.
728x90
'CodingTest > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ_18352 : ํน์ ๊ฑฐ๋ฆฌ์ ๋์ ์ฐพ๊ธฐ (0) | 2024.03.27 |
---|---|
BOJ_1647 : ๋์ ๋ถํ ๊ณํ (0) | 2024.03.14 |
BOJ_27172 : ์ ๋๋๊ธฐ ๊ฒ์ (0) | 2024.03.12 |
BOJ_2166 : ๋ค๊ฐํ์ ๋ฉด์ (0) | 2024.03.11 |
BOJ_13172 : ฮฃ (0) | 2024.03.10 |