티스토리 뷰
https://www.acmicpc.net/problem/1922
1922번: 네트워크 연결
이 경우에 1-3, 2-3, 3-4, 4-5, 4-6을 연결하면 주어진 output이 나오게 된다.
www.acmicpc.net

최소 스패닝 트리를 만들면 되는 문제이다. 지난번 포스팅에서 프림 알고리즘을 사용하였으므로 이번에는 크루스컬 알고리즘을 사용하여 문제를 해결하겠다.
크루스컬 알고리즘은 기본적으로 최소 비용 간선만을 선택해나가야 한다. 하지만 그러면서 별도의 사이클 판단을 해야 하기 때문에 UNION -Find 또한 사용한다.
Union-Find
static int find(int x)
{
if(root[x] == x)
return x;
else{
return root[x] = find(root[x]);
}
}
static void union(int x,int y)
{
x = find(x);
y = find(y);
if(x < y)
root[y] = x;
else
root[x] = y;
}
- Union - Find는 서로소 집합 문제를 해결하는데 정말 많이 사용한다. 기본 형태는 꼭 암기하도록 하자
코드
import java.io.*;
import java.util.*;
public class Main {
static int n = 0;
static int m = 0;
static int[] root;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(st.nextToken());
root = new int[n+1];
for(int i=1;i<=n;i++)
{
root[i] = i;
}
st = new StringTokenizer(br.readLine(), " ");
m = Integer.parseInt(st.nextToken());
int[][] graph = new int[m+1][3];
for(int i=1;i<=m;i++)
{
st = new StringTokenizer(br.readLine(), " ");
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
int cost = Integer.parseInt(st.nextToken());
graph[i][0] = start;
graph[i][1] = end;
graph[i][2] = cost;
}
kruskal(graph);
br.close();
}
static void kruskal(int[][] graph)
{
int cost = 0;
Arrays.sort(graph , (x,y) -> (x[2] - y[2])); // 간선 정렬
for(int i=1;i<=m;i++)
{
if(find(graph[i][0]) != find(graph[i][1])) // 사이클이 형성되지 않는다면
{
union(graph[i][0] , graph[i][1]); // union
cost += graph[i][2]; // 비용 추가
}
}
System.out.println(cost);
}
static int find(int x)
{
if(root[x] == x)
return x;
else{
return root[x] = find(root[x]);
}
}
static void union(int x,int y)
{
x = find(x);
y = find(y);
if(x < y)
root[y] = x;
else
root[x] = y;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
| 백준 14621 (나만 안되는 연애) - java (0) | 2023.06.26 |
|---|---|
| 백준 16398 (행성 연결) - java (0) | 2023.06.25 |
| 백준 1197 (최소 스패닝 트리) - java (0) | 2023.06.23 |
| 백준 2617 (구슬 찾기) - java (0) | 2023.06.21 |
| 백준 11724 (연결 요소) - java (0) | 2023.06.21 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 백준 #1987 #알파벳 #자바 #java
- 백준 #1584 #게임 #java #자바
- 행복합시다.
- 백준 #인구 이동 #16234
- 백준 #1759 #암호 만들기
- 자바 #JAVA
- 백준 #2636 #치즈
- 백준 #17940 #주식 #자바 #java
- 백준 #13549 #숨바꼭질3
- 백준 #12014 #주식 #자바 #java
- 백준
- 올해보다
- 백준 #2580 #스도쿠
- 백준 #1325 #효율적인 해킹
- 자바
- Java
- 백준 #
- 백준 #3980 #선발 명단
- 백준 #5721 #사탕 줍기 대회 #java #자바
- 17394
- 백준 #15686 #치킨 배달
- 백준 #18405 #경쟁적 전염
- 백준 #다리 만들기 #2146
- 백준 #16973 #직사각형 탈출
- 17218
- 백준 #28140 #빨강~ 빨강~ 파랑! 파랑! 달콤한 솜사탕! #java #자바
- 백준 #치즈 #2638
- 백준 #25603 #짱해커 이동식 #java #자바
- 백준 #4963 #섬의 개수
- 백준 #14863 #서울에서 경산까지 #java #자바
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
글 보관함