SWEA_D4_3124
๐ [D4_3124] ์ต์ ์คํจ๋ ํธ๋ฆฌ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
// ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ
public class Solution {
static StringTokenizer st;
// ๋ถ๋ชจ๋
ธ๋ ์ ์ฅํ ๋ฐฐ์ด
static int parents[];
public static void main(String[] args) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// ํ
์คํธ ์ผ์ด์ค ์
int t = Integer.parseInt(br.readLine());
for (int tc = 1; tc <= t; tc++) {
sb.append("#").append(tc).append(" ");
st = new StringTokenizer(br.readLine(), " ");
// ์ ์ ์ ๊ฐ์
int V = Integer.parseInt(st.nextToken());
// ๊ฐ์ ์ ๊ฐ์
int E = Integer.parseInt(st.nextToken());
// ์ ์ ์ ๋ณด 2๊ฐ + ์ด๋๋ฆ ๊ฐ์ค์น ์์ผ๋ก ์
๋ ฅ์ด ๋ค์ด์จ๋ค
int[][] edges = new int[E][3];
// 1๋ฒ๋ถํฐ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด V+1
parents = new int[V + 1];
// ์
๋ ฅ๋ฐ๊ธฐ
for (int i = 0; i < E; i++) {
st = new StringTokenizer(br.readLine(), " ");
edges[i][0] = Integer.parseInt(st.nextToken());
edges[i][1] = Integer.parseInt(st.nextToken());
edges[i][2] = Integer.parseInt(st.nextToken());
}
// ๊ฐ์ค์น ์ค๋ฆ ์ฐจ์์ผ๋ก ์ ๋ฆฌ
Arrays.sort(edges, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
// TODO Auto-generated method stub
// 2๋ฒ ์ธ๋ฑ์ค์ ๊ฐ์ค์น๊ฐ ์๋ค
return Integer.compare(o1[2], o2[2]);
}
});
// parents๋ฅผ -1๋ก ์ด๊ธฐํ
Arrays.fill(parents, -1);
// ์ถ๋ ฅ๋ ๊ฐ์ค์น์ ํฉ
long res = 0;
int cnt = 0;
// ๊ฐ์ ์ ์๋งํผ loop ์ํ
for (int i = 0; i < edges.length; i++) {
// ์ ์ ๊ณผ ์ ์ ์ด ์ฐ๊ฒฐ๋ ์ ์๋์ง ํ์ธ
if (union(edges[i][0], edges[i][1])) {
res += edges[i][2]; // ๊ฐ์ค์น ๋ง์
cnt++;
}
// cnt๊ฐ ( ์ ์ -1๊ฐ )๊ฐ ๋๋ค๋ ๊ฒ์ ๋ชจ๋ ์ ์ ์ ๋ค ์ฐ๊ฒฐํ๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ์ข
ํจ
if (cnt == V - 1) {
break;
}
}
sb.append(res).append("\n");
}
System.out.println(sb);
}
public static int find(int x) {
if (parents[x] < 0)
return x;
return parents[x] = find(parents[x]);
}
static boolean union(int x, int y) {
int xRoot = find(x); // x์ root๋ฅผ ์ฐพ์์ ๊ฒฐ๊ณผ ๋ฐ์
int yRoot = find(y); // y์ root๋ฅผ ์ฐพ์์ ๊ฒฐ๊ณผ ๋ฐ์
if(xRoot != yRoot) {
parents[yRoot] = xRoot;
return true;
}
// ์ฐ๊ฒฐ์ ํ์ง ๋ชปํ ๊ฒฝ์ฐ๋ฉด false
return false;
}
}
๐ค ๋์ ์๊ฐ
๊ฐ์ค์น์ ํฉ์ด ์ต์๋ฅผ ์ถ๋ ฅํด์ผํ๋ค.
๋ธ๋ก๊ทธ๋ฅผ ํตํด ๊ณต๋ถํ์๋ค.
์ค๋ช
์ด ๋๋ฌด ์ ๋์ด์์ด์ ์ฒจ๋ถํ๋ค.
๋์ค์ ํ ๋ฒ ๋ค์ ํ๊ณ ๋ด ์๊ฐ์ ์ ๋ฆฌํด ๋ณด๊ฒ ๋ค.