본문 바로가기
Problem Solving/백준

백준 11085 : 군사 이동

by Libi 2021. 9. 8.
반응형

https://www.acmicpc.net/problem/11085

 

11085번: 군사 이동

전쟁 당시 Baekjoon World의 국왕은 Cube World를 공격할 작전을 세운 적이 있습니다. Baekjoon World와 Cube World는 p개의 지점과 w개의 길로 표현됩니다. 모든 길은 양방향이며, 각 길마다 너비가 존재하여

www.acmicpc.net

[ 문제풀이 ]

크루스칼 알고리즘을 활용해서 c, v가 연결될 때까지 가장 넓은 길부터 차례대로 연결해주면 되는 문제이다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
	
	static class Edge implements Comparable<Edge> {
		int from, to, width;
		
		Edge (int from, int to, int width) {
			this.from = from;
			this.to = to;
			this.width = width;
		}

		@Override
		public int compareTo(Edge o) {
			return o.width - this.width;
		}
	}
	
	static int p, w, c, v;
	static int[] parent;
	static PriorityQueue<Edge> pq;
	
	public static void main(String[] args) {
		try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
				BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			p = Integer.parseInt(st.nextToken());
			w = Integer.parseInt(st.nextToken());
			
			st = new StringTokenizer(br.readLine());
			c = Integer.parseInt(st.nextToken());
			v = Integer.parseInt(st.nextToken());
			
			parent = new int[p];
			for (int i = 0; i < p; ++i) parent[i] = i;
			
			pq = new PriorityQueue<>();
			for (int i = 0; i < w; ++i) {
				st = new StringTokenizer(br.readLine());
				int from = Integer.parseInt(st.nextToken());
				int to = Integer.parseInt(st.nextToken());
				int width = Integer.parseInt(st.nextToken());
				pq.offer(new Edge(from, to, width));
			}
			
			while (!pq.isEmpty()) {
				Edge e = pq.poll();
				
				union(e.from, e.to);
				if (isSameParent(c, v)) {
					bw.write(e.width + "\n");
					break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static int getParent(int v) {
		return v == parent[v] ? v : (parent[v] = getParent(parent[v]));
	}
	
	public static void union(int a, int b) {
		a = getParent(a);
		b = getParent(b);
		parent[b] = a;
	}
	
	public static boolean isSameParent(int a, int b) {
		return getParent(a) == getParent(b);
	}
}
반응형

'Problem Solving > 백준' 카테고리의 다른 글

백준 2075 : N번째 큰 수  (0) 2021.09.18
백준 12738 : 가장 긴 증가하는 부분 수열 3  (0) 2021.09.12
백준 13397 : 구간 나누기 2  (0) 2021.09.06
백준 9470 : Strahler 순서  (0) 2021.09.04
백준 1029 : 그림 교환  (0) 2021.08.31

댓글