사용 알고리즘: 크루스칼
사용 언어: java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main_1922_네트워크연결_크루스칼 {
static int n, m;
static int[][] connection;
static int[] parent;
public static void main(String[] args) throws IOException {
input();
//간선 가중치 기준으로 오름차순 정렬
Arrays.sort(connection,(o1, o2) -> o1[2] - o2[2]); //뭔데 **
initParent();
int answer = 0;
for (int i = 0; i < m; i++) {
int com1 = connection[i][0];
int com2 = connection[i][1];
int val = connection[i][2];
int p1 = find(com1); //부모 찾기
int p2 = find(com2);
if(p1 != p2) {
answer += val;
union(com1, com2);
}
}
System.out.println(answer);
}
private static void union(int com1, int com2) {
com1 = find(com1);
com2 = find(com2);
if(com1 < com2) {
parent[com2] = com1;
}
else {
parent[com1] = com2;
}
}
private static int find(int x) {
if(x == parent[x]) return x;
return parent[x] = find(parent[x]); //맨 윗 조상 찾기
}
private static void initParent() {
parent = new int[n+1];
for (int i = 0; i < n+1; i++) {
parent[i] = i;
}
}
private static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
m = Integer.parseInt(br.readLine());
connection = new int[m][3];
for (int i = 0; i < m; i++) {
String[] s = br.readLine().split(" ");
for (int j = 0; j < 3; j++) {
connection[i][j] = Integer.parseInt(s[j]);
}
}
}
}
크루스칼 연습을 위해 바로 풀어본 문제.
크루스칼... 이해는 된 거 같다. 얼마나 응용될지는 미지수
크루스칼 연습
'알고리즘 > 백준' 카테고리의 다른 글
5972_택배 배송 *(거의 다 됨) (0) | 2024.03.10 |
---|---|
18352_ 특정 거리의 도시 찾기 (3) | 2024.03.07 |
11559_Puyo Puyo 뿌요뿌요 - 원샷원킬~ (2) | 2024.03.05 |
2468_안전 영역 (1) | 2024.01.24 |
2644_촌수계산 (0) | 2024.01.23 |