Algorithm/Backjoon

[ 백준 1647번 JAVA ] 도시 분할 계획

youth787 2024. 4. 14. 01:20

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

 

1647번: 도시 분할 계획

첫째 줄에 집의 개수 N, 길의 개수 M이 주어진다. N은 2이상 100,000이하인 정수이고, M은 1이상 1,000,000이하인 정수이다. 그 다음 줄부터 M줄에 걸쳐 길의 정보가 A B C 세 개의 정수로 주어지는데 A번

www.acmicpc.net

 

 

solve

package GOLD;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;


// 크루스칼 알고리즘
// 입력을 받아서 전체적으로 최소 스패닝 트리를 구하고
// 가장 큰 숫자 하나를 끊어서 두영역으로 나눈다.

public class 도시분할계획 {
    static int[] p; // 부모를 저장할 배열
    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());
        int[][] edges = new int[M][3];

        for(int i=0; i<M; i++){
            st = new StringTokenizer(br.readLine());
            edges[i][0] = Integer.parseInt(st.nextToken());
            edges[i][1] = Integer.parseInt(st.nextToken());
            edges[i][2] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(edges, (o1,o2)->(o1[2]-o2[2])); // 오름차순

        p = new int[N+1];
        for(int i=1; i<=N; i++){
            p[i] = i;
        }

        int cost = 0;
        int pick =0;
        int max = Integer.MIN_VALUE;

        for(int i=0; i<M; i++){
            int px = findset(edges[i][0]);
            int py = findset(edges[i][1]);

            if(px != py){ // 사이클이 형성이 안되는 경우
                union(px,py);
                cost += edges[i][2];
                pick++;
                if(max<edges[i][2]) max = edges[i][2];
            }

            if(pick == N-1) break;
        }

        System.out.println(cost-max);
    }

    public static void union(int x, int y){
        p[findset(y)] = findset(x);
    }

    public static int findset(int x){
        if(x!=p[x]){
            p[x] = findset(p[x]);
        }
        return p[x];
    }
}

 

크루스칼 알고리즘 

https://wkdus885.tistory.com/37

 

[ 그래프 MST ] 크루스칼 알고리즘

신장 트리 : 그래프의 모든 정점과 간선의 부분 집합으로 구성되는 트리. 신장 트리는 여러가지. 최소 신장 트리 : 신장 트리 중에서 사용된 간선들의 가중치 합이 최소인 트리. 최소 신장 트리도

wkdus885.tistory.com

 

반응형