녕의 학습 기록

백준_1414 불우이웃돕기 (mst) 본문

Algorithm/Algorithm 문제

백준_1414 불우이웃돕기 (mst)

kjyyjk 2024. 3. 4. 18:16

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.PriorityQueue;

public class BJ_1414_불우이웃돕기 {

    static int[] parent;
    static PriorityQueue<Edge> edges;

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        int i;
        parent = new int[n];
        for (i=0; i<n; i++) {
            parent[i] = i;
        }

        edges = new PriorityQueue<>(new Comparator<Edge>() {
            @Override
            public int compare(Edge o1, Edge o2) {
                return o1.value - o2.value;
            }
        });

        String temp;
        int j, length;
        int totalLength = 0;
        char tempChar;
        for (i=0; i<n; i++) {
            temp = br.readLine();
            for (j=0; j<n; j++) {
                tempChar = temp.charAt(j);

                if (tempChar != '0') {
                    if (tempChar <= 'z' && tempChar >= 'a') {
                        length = tempChar - 96;
                    } else {
                        length = tempChar - 38;
                    }

                    totalLength += length;

                    if (i!=j) {
                        edges.add(new Edge(i, j, length));
                    }
                }
            }
        }

        int useEdge = 0;
        int mstLength = 0;
        Edge nowEdge;
        while (useEdge < n - 1 && !edges.isEmpty()) {
            nowEdge = edges.poll();

            if (find(nowEdge.a) != find(nowEdge.b)) {
                union(nowEdge.a, nowEdge.b);
                mstLength += nowEdge.value;
                useEdge++;
            }
        }

        if (useEdge != n-1) {
            System.out.println(new StringBuilder().append(-1));
        } else {
            System.out.println(new StringBuilder().append(totalLength - mstLength));
        }
    }

    static int find(int a) {
        if (parent[a] == a) {
            return a;
        } else {
            int temp = find(parent[a]);
            parent[a] = temp;
            return temp;
        }
    }

    static void union(int a, int b) {
        a = find(a);
        b = find(b);

        if (a != b) {
            parent[b] = a;
        }
    }

    static class Edge {
        int a;
        int b;
        int value;

        public Edge(int a, int b, int value) {
            this.a = a;
            this.b = b;
            this.value = value;
        }
    }

}
 

1414번: 불우이웃돕기

첫째 줄에 컴퓨터의 개수 N이 주어진다. 둘째 줄부터 랜선의 길이가 주어진다. i번째 줄의 j번째 문자가 0인 경우는 컴퓨터 i와 컴퓨터 j를 연결하는 랜선이 없음을 의미한다. 그 외의 경우는 랜선

www.acmicpc.net