알고리즘

백준 13418번 학교 탐방하기 (JAVA)

박카스마시며코딩 2022. 1. 20. 14:52

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

 

13418번: 학교 탐방하기

입력 데이터는 표준 입력을 사용한다. 입력은 1개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 건물의 개수 N(1≤N≤1,000)과 도로의 개수 M(1≤M≤n*(n-1)/2) 이 주어진다. 입력의 두 번째 줄

www.acmicpc.net

 

 

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

하나는 프림을 가장 짧은 것을 추적하도록 하였고, 하나는 가장 긴 것을 추적하도록 작성하여 문제를 풀었습니다.

 

 

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_13418 {

    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 m = stoi.apply(st.nextToken());
        int[][] map = new int[n+1][n+1];
        for(int i = 0 ; i <= n ; i++){
            Arrays.fill(map[i],-1);
        }
        for(int i = 0 ; i < m + 1 ; i++){
            st = new StringTokenizer(br.readLine());
            int a = stoi.apply(st.nextToken());
            int b = stoi.apply(st.nextToken());
            int c = stoi.apply(st.nextToken());
            c++;
            c%= 2;
            map[a][b] = c;
            map[b][a] = c;
        }
        int result = (int) (Math.pow(primMax(map,n),2) - Math.pow(primMin(map,n),2));
//        System.out.println(primMax(map,n));
//        System.out.println(primMin(map,n));
        System.out.println(result);
    }

    private static int primMin(int[][] map,int n) {
        int[] distance = new int[n+1];
        Arrays.fill(distance, Integer.MAX_VALUE);
        distance[0] = 0;
        int result = 0;
        boolean[] visited = new boolean[n+1];
        for(int i = 0 ; i <= n ; i++){
            int minValue = Integer.MAX_VALUE;
            int minIndex = 0;
            for(int j = 0 ; j <= n ; j++){
                if(!visited[j] && minValue > distance[j]){
                    minIndex = j;
                    minValue = distance[j];
                }
            }
            visited[minIndex] = true;
            if(minValue == Integer.MAX_VALUE){
                break;
            }
            result += minValue;
            for(int j = 0 ; j <= n ; j++){
                if(!visited[j] && map[minIndex][j] != -1 && distance[j] > map[minIndex][j]){
                    distance[j] = map[minIndex][j];
                }
            }
        }
        return result;
    }
    private static int primMax(int[][] map,int n) {
        int[] distance = new int[n+1];
        Arrays.fill(distance, -1);
        distance[0] = 0;
        int result = 0;
        boolean[] visited = new boolean[n+1];
        for(int i = 0 ; i <= n ; i++){
            int maxValue = -1;
            int maxIndex = 0;
            for(int j = 0 ; j <= n ; j++){
                if(!visited[j] && maxValue < distance[j]){
                    maxIndex = j;
                    maxValue = distance[j];
                }
            }
            visited[maxIndex] = true;
            if(maxValue == -1){
                break;
            }
            result += maxValue;
            for(int j = 0 ; j <= n ; j++){
                if(!visited[j] && map[maxIndex][j] != -1 && distance[j] < map[maxIndex][j]){
                    distance[j] = map[maxIndex][j];
                }
            }
        }
        return result;
    }
}

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

백준 9625번 BABBA (JAVA)  (0) 2022.01.22
백준 1963번 소수 경로 (JAVA)  (0) 2022.01.21
백준 1949번 우수마을 (JAVA)  (0) 2022.01.19
백준 2533번 사회망 서비스 (JAVA)  (0) 2022.01.18
백준 9470번 Strahler 순서 (JAVA)  (0) 2022.01.17