https://www.acmicpc.net/problem/11085
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 256 MB | 514 | 330 | 262 | 61.358% |
문제
전쟁 당시 Baekjoon World의 국왕은 Cube World를 공격할 작전을 세운 적이 있습니다. Baekjoon World와 Cube World는 p개의 지점과 w개의 길로 표현됩니다. 모든 길은 양방향이며, 각 길마다 너비가 존재하여 이에 비례하는 수의 군사가 지나갈 수 있습니다.
Baekjoon World의 국왕은 군사들이 뭉치는 것이 유리하다고 생각해서, 미리 Cube World로 가는 경로를 정해 두고 그 경로로만 모든 군사를 보냈습니다. Baekjoon World의 국왕은 총명해서, 경로 상에 있는 길 중 너비가 가장 좁은 길의 너비를 최대화하는 경로를 택했습니다.
그런데 전쟁 때문에 어느 길로 보냈는지에 대한 기록이 불타 없어져 버렸습니다. 전쟁사를 완성하려면 이 기록이 꼭 필요합니다. 위대한 과학자인 당신이 다시 복구해 주세요.
입력
첫 줄에 p와 w가 공백을 사이에 두고 주어집니다. (2 ≤ p ≤ 1 000; 1 ≤ w ≤ 50 000)
다음 줄에 Baekjoon World의 수도 c와 Cube World의 수도 v가 공백을 사이에 두고 주어집니다. (0 ≤ c, v < p; c ≠ v)
다음 w줄에 길이 연결하는 두 지점 wstart, wend,와 길의 너비 wwidth가 공백을 사이에 두고 주어집니다. (0 ≤ wstart, wend < p; wstart ≠ wend; 1 ≤ wwidth ≤ 1 000)
출력
첫 줄에 Baekjoon World의 국왕이 정한 경로 상에 있는 길 중 너비가 가장 좁은 길의 너비를 출력합니다.
예제 입력 1
7 11
3 5
0 1 15
0 2 23
1 2 16
1 3 27
2 4 3
2 6 21
3 4 14
3 5 10
4 5 50
4 6 9
5 6 42
예제 출력 1
16
코드
/*
군사이동
크루스칼, MST(Union-Find by Rank)
*/
import java.io.*;
import java.util.*;
public class p11085 {
static class Edge implements Comparable<Edge>{
int u, v, cost;
public Edge (int u, int v, int cost) {
this.u = u;
this.v = v;
this.cost = cost;
}
public int compareTo(Edge o) {
return o.cost - cost;
}
}
static int p, w, c, v;
static int[] parent, rank;
static PriorityQueue<Edge> pq = new PriorityQueue<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
p = Integer.parseInt(st.nextToken());
w = Integer.parseInt(st.nextToken());
parent = new int[p];
rank = new int[p];
for (int i = 0; i < p; i++) {
parent[i] = i;
}
st = new StringTokenizer(br.readLine());
c = Integer.parseInt(st.nextToken());
v = Integer.parseInt(st.nextToken());
for (int i = 0; i < w; i++) {
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
int cost = Integer.parseInt(st.nextToken());
pq.add(new Edge(u, v, cost));
}
mst();
}
static void mst() {
int ret = 0;
while (!pq.isEmpty()) {
Edge edge = pq.poll();
union(edge.u, edge.v);
// 모든 경로들을 union하면서, c와 v가 서로 연결되어있는지 확인한다. (같은 루트인지)
if (find(c) == find(v)) {
ret = edge.cost;
break;
}
}
System.out.println(ret);
}
static void union(int u, int v) {
u = find(u);
v = find(v);
if (u != v) {
if (rank[u] < rank[v]) {
parent[u] = v;
} else {
parent[v] = u;
if (rank[u] == rank[v]) {
rank[u]++;
}
}
}
}
static int find(int x) {
if (x == parent[x]) return x;
return parent[x] = find(parent[x]);
}
}
'알고리즘 > [ Baekjoon ]' 카테고리의 다른 글
[ BOJ ][JAVA][13565] 침투 (0) | 2021.05.31 |
---|---|
[ BOJ ][JAVA][12757] 전설의 JBNU (0) | 2021.05.31 |
[ BOJ ][JAVA][10423] 전기가 부족해 (0) | 2021.05.30 |
[ BOJ ][JAVA][14675] 단절점과 단절선 (0) | 2021.05.28 |
[ BOJ ][JAVA][10159] 저울 (0) | 2021.05.28 |