알고리즘

백준 1833번 고속철도 설계하기 (JAVA)

박카스마시며코딩 2022. 8. 25. 22:02

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

 

1833번: 고속철도 설계하기

첫째 줄에 자연수 N이 주어진다. 다음 N개의 줄에는 인접행렬 형태로 두 도시 사이에 고속철도를 설치할 때 드는 비용이 주어진다. 이 비용은 각각 10,000을 넘지 않는 자연수이다. 만약 비용이 음

www.acmicpc.net

 

저는 프림 알고리즘을 통해 문제를 해결하였습니다.

먼저 입력의 음수의 절대값을 더하고 이를 반으로 나누었습니다. 그리고 음수의 값을 0으로 초기화하였습니다.

프림 알고리즘을 통해 최소 스패닝 트리를 만들어 해결하였습니다.

 

 

package BOJ.mst;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_1833 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Function<String,Integer> stoi = Integer::parseInt;
        int n = stoi.apply(st.nextToken());
        int[][] map = new int[n][n];
        int result = 0;
        for(int i = 0 ; i < n ; i++){
            st = new StringTokenizer(br.readLine());
            for(int j = 0 ; j < n ; j++){
                map[i][j] = stoi.apply(st.nextToken());
                if(map[i][j] < 0){
                    result -= map[i][j];
                    map[i][j] = 0;
                }
            }
        }
        result /= 2;
        prim(map,n,result);
    }

    private static final int INF = 987654321;

    private static void prim(int[][] map, int n,int result) {
        int[] distance = new int[n];
        int[] prevIndex = new int[n];
        Arrays.fill(distance,INF);
        distance[0] = 0;
        boolean[] visited = new boolean[n];

        int cnt = 0;
        StringBuilder sb = new StringBuilder();
        for(int i = 0 ; i < n ; i++){
            int minValue = INF;
            int minIndex = 0;
            for(int j = 0 ; j < n ; j++){
                if(!visited[j] && minValue > distance[j]){
                    minValue = distance[j];
                    minIndex = j;
                }
            }
            visited[minIndex] = true;
            result += Math.abs(minValue);
            if(i != 0 && minValue > 0){
                cnt++;
                sb.append( (prevIndex[minIndex]+1)+" "+(minIndex+1)+"\n");
            }
            for(int j = 0 ; j < n ; j++){
                if(!visited[j] && distance[j] > map[minIndex][j]){
                    distance[j] = map[minIndex][j];
                    prevIndex[j] = minIndex;
                }
            }
        }
        System.out.println(result+" "+cnt);
        System.out.println(sb.toString());
    }
}

 

'알고리즘' 카테고리의 다른 글

백준 23757번 아이들과 선물 상자 (JAVA)  (0) 2022.08.27
백준 4158번 CD (JAVA)  (0) 2022.08.26
백준 16472번 고냥이 (JAVA)  (0) 2022.08.24
백준 1826번 연료 채우기 (JAVA)  (0) 2022.08.23
백준 14562번 태권왕 (JAVA)  (0) 2022.08.22