https://www.acmicpc.net/problem/1647
이번 문제로 MST 알고리즘입니다. 다만 MST에서 살짝 변형을 준 문제라고 생각해도 될 것 같습니다.
MST인 경우에는 모든 집을 연결하는 최소한의 간선 합을 구하는 것인데 여기서는 집을 두 개의 집단으로 나눠야 하기 때문에 최소한의 간선들 중 제일 큰 값을 빼면 됩니다. 그러면 A구역 B구역으로 자연스럽게 나누어질 것 입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Backjoon_1647_도시_분할_계획  {
    public static class Node implements Comparable<Node>{
        int idx1, idx2, cost;
        public Node(int idx1, int idx2, int cost) {
            this.idx1 = idx1;
            this.idx2 = idx2;
            this.cost = cost;
        }
        @Override
        public int compareTo(Node n){
            return this.cost - n.cost;
        }
    }
    static int[] parent;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        parent = new int[N+1];
        PriorityQueue<Node> pq = new PriorityQueue<>();
        Arrays.fill(parent, -1);
        for(int i = 0 ; i < M ; i++){
            st = new StringTokenizer(br.readLine());
            int v1 = Integer.parseInt(st.nextToken());
            int v2 = Integer.parseInt(st.nextToken());
            int cost = Integer.parseInt(st.nextToken());
            pq.offer(new Node(v1,v2,cost));
        }
        int answer = 0;
        int max = 0;
        int count = 0;
        int size = pq.size();
        for(int i = 0 ; i < size ; i++){
            Node node = pq.poll();
            if(union(node.idx1, node.idx2)){
                answer += node.cost;
                max = Math.max(max, node.cost);
                count++;
            }
            if(count == N - 1){
                break;
            }
        }
        System.out.println(answer - max);
    }
    public static boolean union(int v1, int v2){
        v1 = find(v1);
        v2 = find(v2);
        if(v1 == v2) return false;
        if(parent[v1] < parent[v2]){
            parent[v1] += parent[v2];
            parent[v2] = v1;
        }else{
            parent[v2] += parent[v1];
            parent[v1] = v2;
        }
        return true;
    }
    public static int find(int v){
        if(parent[v] < 0){
            return v;
        }
        return parent[v] = find(parent[v]);
    }
}'알고리즘' 카테고리의 다른 글
| [백준/Java] 2623 : 음악프로그램 (8) | 2025.02.19 | 
|---|---|
| [백준/Java] 21276 : 계보 복원가 호석 (4) | 2025.02.19 | 
| [백준/Java] 1197 : 최소 스패닝 트리 (2) | 2025.02.18 | 
| [백준/Java] 14938 : 서강그라운드 (2) | 2025.02.18 | 
| [백준/Java] 21940 : 가운데에서 만나기 (8) | 2025.02.17 |