View
[SWEA] 3124: ์ต์ ์คํจ๋ ํธ๋ฆฌ(Java)
์ฑ ์ฝ๋ ๊ฐ์ 2022. 8. 30. 21:45๋ฌธ์
๊ทธ๋ํ๊ฐ ์ฃผ์ด์ก์ ๋, ๊ทธ ๊ทธ๋ํ์ ์ต์ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ต์ ์คํจ๋ ํธ๋ฆฌ๋, ์ฃผ์ด์ง ๊ทธ๋ํ์ ๋ชจ๋ ์ ์ ๋ค์ ์ฐ๊ฒฐํ๋ ๋ถ๋ถ ๊ทธ๋ํ ์ค์์ ๊ทธ ๊ฐ์ค์น์ ํฉ์ด ์ต์์ธ ํธ๋ฆฌ๋ฅผ ๋งํ๋ค.
์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ๊ทธ๋ํ๋ ํ๋์ ์ฐ๊ฒฐ ๊ทธ๋ํ์์ด ๋ณด์ฅ๋๋ค.
์ ๋ ฅ
๊ฐ์ฅ ์ฒซ ๋ฒ์งธ ์ค์๋ ์ ์ฒด test case์ ์ T(1โคTโค10)๊ฐ ์ฃผ์ด์ง๋ค.
๊ฐ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์๋ ์ ์ ์ ๊ฐ์ V(1โคVโค100,000)์ ๊ฐ์ ์ ๊ฐ์ E(1โคEโค200,000)๊ฐ ์ฃผ์ด์ง๋ค.
๋ค์ E๊ฐ์ ์ค์๋ ๊ฐ ๊ฐ์ ์ ๋ํ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ์ธ ์ ์ A, B, C๊ฐ ์ฃผ์ด์ง๋ค.
์ด๋ A๋ฒ ์ ์ ๊ณผ B๋ฒ ์ ์ ์ด ๊ฐ์ค์น C์ธ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๋ ์๋ฏธ์ด๋ค.
C๋ ์์์ผ ์๋ ์์ผ๋ฉฐ, ์ ๋๊ฐ์ด 1,000,000์ ๋์ง ์๋๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ์ผ์ด์ค๋ง๋ค ํ ์ค์ ๊ฑธ์ณ, ํ ์คํธ์ผ์ด์ค ์ โ#(ํ ์คํธ์ผ์ด์ค ๋ฒํธ) โ๋ฅผ ์ถ๋ ฅํ๊ณ , ์ต์ ์คํจ๋ ํธ๋ฆฌ์ ๊ฐ์ค์น๋ฅผ ์ถ๋ ฅํ๋ค.
ํํธ
์ต์ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก Prim's algorithm๊ณผ Kruskal's algorithm์ด ์๋ค.
๋ณธ ๋ฌธ์ ์์๋ ์ฃผ์ด์ง๋ ์ ์ ๊ณผ ๊ฐ์ ์ ๊ฐ์๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ์ด ํ์ํ๋ค.
Prim's algorithm์ ์ด์ฉํ ๊ฒฝ์ฐ, ์๋ฃ๊ตฌ์กฐ ํ(heap)์ ์ด์ฉํด์ผ ํ๋ค.
Kruskal's algorithm์ ์ด์ฉํ ๊ฒฝ์ฐ, Disjoint Set(์๋ก์ ์งํฉ) ํน์ Union-Find ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด์ผ ํ๋ค.
์์ ์ ๋ ฅ 1
1
3 3
1 2 1
2 3 2
1 3 3
์์ ์ถ๋ ฅ 1
#1 3
S๊ฐ 0์ผ๋๋ sum=0์ ์ด๊ธฐํ์ ๊ฒน์น๋ฏ๋ก ์ ๊ฒฝ์จ์ค์ผํ๋ค
๋ถ๋ถ์งํฉ์ผ๋ก ํ๋ฉด ์ฝ๊ฒ ํ ์ ์์
๐คฆโโ๏ธ My Solution
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Solution_3124 {
static class Edge implements Comparable<Edge> {
int start;
int end;
int weight;
public Edge(int start, int end, int weight) {
super();
this.start = start;
this.end = end;
this.weight = weight;
}
@Override
public int compareTo(Edge o) { // ๊ฐ์ค์น ์ค๋ฆ์ฐจ์์ผ๋ก ์ ์ฅ
return this.weight - o.weight;
}
}
static Edge[] edgeList;
static int[] parents;
static int V, E;
public static void make() { //์ ์ผํ ๋ฉค๋ฒ๋ฅผ ํฌํจํ๋ ์๋ก์ด ์งํฉ์ ์์ฑ
for (int i = 0; i < V; i++) {
parents[i] = i;
}
}
public static int find(int a) { ์งํฉ ์ฐพ๋ ์ฐ์ฐ
if (parents[a] == a) {
return a;
}
return parents[a] = find(parents[a]);
}
public static boolean union(int a, int b) { //๋ ์งํฉ์ ํฉ์น๋ ์ฐ์ฐ
int aRoot = find(a);
int bRoot = find(b);
if (aRoot == bRoot) {
return false;
}
parents[bRoot] = aRoot;
return true;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
for (int i = 1; i <= N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
V = Integer.parseInt(st.nextToken());
E = Integer.parseInt(st.nextToken());
parents = new int[V];
edgeList = new Edge[E];
for (int k = 0; k < E; k++) {
st = new StringTokenizer(br.readLine().trim());
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
int weight = Integer.parseInt(st.nextToken());
edgeList[k] = new Edge(from, to, weight);
} // ๊ฐ์ ์ ์ฅ
make();
// ๊ฐ์ ๋น์ฉ์ด ์์ ์์๋๋ก ์ ๋ ฌ
Arrays.sort(edgeList);
long result = 0;
int count = 0;// ์ฐ๊ฒฐ ๊ฐ์ ์
for (Edge edge : edgeList) {
if (union(edge.start - 1, edge.end - 1)) { // ์ธ์ดํด์ด ๋ฐ์ํ์ง ์์์ผ๋ฉด
result += edge.weight; // ๊ฐ์ค์น๊ฐ ์ ์ฅ
if (++count == V - 1) { // ์ฐ๊ฒฐ ๊ฐ์ ์๊ฐ ์ ์ ์ -1์ด๋ฉด ๋ค ์ฐ๊ฒฐํจ
break;
}
}
}
System.out.println("#" + i + " " + result);
}
}
}
'์๊ณ ๋ฆฌ์ฆ > ์ฝ๋ฉํ ์คํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ฌธ์์ด ๋ด ๋ง์๋๋ก ์๋ฅด๊ธฐ(Java) (0) | 2022.10.01 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ฌธ์์ด ๋ค๋ฃจ๊ธฐ ๊ธฐ๋ณธ(Java) (0) | 2022.10.01 |
[BJ] 1182๋ฒ: ๋ถ๋ถ์์ด์ ํฉ (0) | 2022.08.30 |
[BJ] 2003๋ฒ: ์๋ค์ ํฉ2 (Java) (0) | 2022.08.30 |
[BJ]10974๋ฒ: ๋ชจ๋ ์์ด(Java) (0) | 2022.08.30 |