Repository navigation
21.09.02 [백준] 1197 최소 스패닝 트리 - 최소신장 트리 / 크루스칼 알고리즘 #297
Copy link
Copy link
Closed
Labels
Description
아이디어
- 간선의 크기가 가장 작은 것을 뽑는다.
- 선택한 간선의 두 정점이 같은 그룹인지 비교
2-1. 같은 그룹이면 skip
2-2. 다른 그룹이면 같은 그룹으로 만들고, 선택한 간선을 최소 신장 트리에 추가 - 1~2를 반복하고, 최소 신장 트리에 V-1개 간선이 선택되면 종료
어려운점 & 실수
정답
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
/**
* 3 3
* 1 2 1
* 2 3 2
* 1 3 3
*/
public class N1197 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int V = Integer.parseInt(st.nextToken());
int E = Integer.parseInt(st.nextToken());
// 비방향 연결 그래프
PriorityQueue<Node> graph = new PriorityQueue<>();
for (int i = 0; i < E; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int edge = Integer.parseInt(st.nextToken());
graph.add(new Node(a, b, edge));
}
int result = spanningKruskal(V, graph);
System.out.println(result);
}
private static int spanningKruskal(final int v, final PriorityQueue<Node> graph) {
// 그룹(부모)정보 저장 - 같은 그룹인지 확인용
int[] parent = new int[v + 1];
for (int i = 0; i < parent.length; i++) {
parent[i] = i; //자기 자신의 그룹에 속하도록 초기화
}
int result = 0;
int cnt = 0;
while (!graph.isEmpty()) {
Node node = graph.poll();
if(isEqualParent(parent, node.a, node.b)) {
continue;
}
result += node.cost;
cnt++;
union(parent, node.a, node.b);
if (cnt == v - 1) break;
}
return result;
}
public static void union(int[] parent, int prev, int cur) {
int prevParent = getParent(parent, prev);
int curParent = getParent(parent, cur);
if (prevParent <= curParent) {
parent[curParent] = prevParent;
} else {
parent[prevParent] = curParent;
}
}
public static boolean isEqualParent(int[] parent, int a, int b) {
a = getParent(parent, a);
b = getParent(parent, b);
return a == b;
}
private static int getParent(final int[] parent, final int x) {
if (parent[x] == x) {
return x;
}
return parent[x] = getParent(parent, parent[x]);
}
static class Node implements Comparable<Node> {
int a;
int b;
int cost;
public Node(final int a, final int b, final int cost) {
this.a = a;
this.b = b;
this.cost = cost;
}
@Override
public int compareTo(final Node o) {
return cost - o.cost;
}
}
}Reactions are currently unavailable
Activity
blossun commentedon Sep 2, 2021
최적화
blossun commentedon Sep 2, 2021
수정전 코드
[BJ] 1197 최소 스패팅 트리 - 최적화
[BJ] 1197 최소 스패팅 트리 - 최적화 - rank
[-]21.09.02 [백준] 1197 최소 스패닝 트리[/-][+]21.09.02 [백준] 1197 최소 스패닝 트리 - 최소신장 트리 / 크루스칼 알고리즘[/+]