Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 버퍼비우기
- 17472
- 캡슐화
- 생성자
- Final
- inheritance
- 열거형
- this
- Encapsulation
- 추상화
- java
- 객체지향
- python
- 인터페이스
- 프림알고리즘
- nextInt
- 상속
- 백준
- 최소신장트리
- abstract
- Scanner
- 제네릭
- 객체 지향
- polymorphism
- 와일드카드
- enum
- 추상 클래스
- 다형성
- 내부 클래스
Archives
- Today
- Total
쫑쫑이의 블로그
백준 11085 군사 이동 Java [분리집합 Union find] 본문
https://www.acmicpc.net/problem/11085
11085번: 군사 이동
전쟁 당시 Baekjoon World의 국왕은 Cube World를 공격할 작전을 세운 적이 있습니다. Baekjoon World와 Cube World는 p개의 지점과 w개의 길로 표현됩니다. 모든 길은 양방향이며, 각 길마다 너비가 존재하여
www.acmicpc.net
백준 월드에서 큐브 월드를 공격한다는 말은
백준 월드 수도 c와 큐브 월드 수도 v가 하나의 집합에 속해야한다는 뜻이다
경로 상에 있는 길 중 너비가 가장 좁은 길의 너비를 최대화하는 경로를 택한다는 말은
큰 길만 골라간 것과 같다
즉, c와 v가 하나의 집합이 될 때까지 너비 기준 최대 우선순위 큐로
입력값을 큐에서 하나씩 꺼내서 서로 연결되지 않았으면 연결한다
c와 v가 하나의 집합에 속하면 최근에 연결한 길의 너비를 출력한다
import java.io.*;
import java.util.*;
public class Main {
static int[] parents;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int P = Integer.parseInt(st.nextToken());
int W = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
int c = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
parents = new int[P];
for (int p = 0; p < P; p++) parents[p] = p;
Queue<int[]> queue = new PriorityQueue<>(((o1, o2) -> o2[2] - o1[2]));
for (int w = 0; w < W; w++) {
queue.add(Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray());
}
int result = 0;
while (find(c) != find(v)) {
int[] arr = queue.poll();
if (find(arr[0]) != find(arr[1])) {
union(arr[0], arr[1]);
result = arr[2];
}
}
System.out.println(result);
}
static int find(int x) {
if (parents[x] == x) return x;
return parents[x] = find(parents[x]);
}
static void union(int x, int y) {
int px = find(x);
int py = find(y);
if (px != py) parents[px] = py;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 7662 이중 우선순위 큐 Java [우선순위 큐] (0) | 2022.11.26 |
---|---|
백준 1516 게임 개발 Java [위상정렬, DP] (0) | 2022.11.25 |
백준 1976 여행 가자 Java [분리집합, Union find] (0) | 2022.11.23 |
백준 1717 집합의 표현 Java [분리집합, Union find] (0) | 2022.11.22 |
백준 10986 나머지 합 Java [누적합] (0) | 2022.11.21 |