728x90
1. 문제
2. 풀이
- result type==> long이다. 타입체크를 잊지 말아야 한다.
- 최소 간선 순으로 합집합하되 싸이클이 생긴다면(find(a)==find(b)) 추가하지 않고 다음 간선으로 넘어간다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class D4_3124_최소스패닝트리 {
static int[] sets;
static int[] size;
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(in.readLine());
StringTokenizer st;
StringBuilder sb = new StringBuilder();
for (int tc = 1; tc <= T; tc++) {
st = new StringTokenizer(in.readLine());
int V = Integer.parseInt(st.nextToken());
int E = Integer.parseInt(st.nextToken());
sets = new int[V+1];
size = new int[V+1];
for (int i = 1; i <= V; i++) sets[i] = i;
PriorityQueue<int[]> pQueue = new PriorityQueue<>((o1, o2) -> o1[2] - o2[2]);
for (int i = 0; i < E; i++) {
st = new StringTokenizer(in.readLine());
pQueue.offer(new int[]{Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())});
}
int n = 0;
long result = 0;
while (n!=V-1) {
int[] graph = pQueue.poll();
if (!union(graph[0], graph[1])) continue;
result += graph[2];
n++;
}
sb.append("#").append(tc).append(" ").append(result).append("\n");
}
System.out.print(sb);
}
private static int find(int x) {
if (sets[x] == x) return x;
return sets[x] = find(sets[x]);
}
private static boolean union(int a, int b) {
int pa = find(a);
int pb = find(b);
if (pa == pb) return false;
if (size[pa] > size[pb]) sets[pb] = pa;
else if (size[pa] == size[pb]) size[pb]++;
if (size[pb] > size[pa]) sets[pa] = pb;
return true;
}
}
3. 결과
'코딩테스트 > SWEA' 카테고리의 다른 글
[SWEA] 5643 키 순서 - JAVA (0) | 2022.04.07 |
---|---|
[SWEA] 1263 사람 네트워크 2 - JAVA (0) | 2022.04.05 |
[SWEA] 1251 하나로 - JAVA (0) | 2022.03.01 |
[SWEA] 7465 창용 마을 무리의 개수 - JAVA (0) | 2022.02.23 |
[SWEA] 3289 서로소집합 - JAVA (0) | 2022.02.23 |
댓글