알고리즘

백준 14950번 정복자 (JAVA)

박카스마시며코딩 2022. 2. 2. 20:38

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

 

14950번: 정복자

서강 나라는 N개의 도시와 M개의 도로로 이루어졌다. 모든 도시의 쌍에는 그 도시를 연결하는 도로로 구성된 경로가 있다. 각 도로는 양방향 도로이며, 각 도로는 사용하는데 필요한 비용이 존재

www.acmicpc.net

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

프림 알고리즘에서 i가 2보다 클때부터 i*t를 더 해주어 정복했을 때 t비용이 증가하는 것을 구현하였습니다.

 

package BOJ.MST;

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

public class BOJ_14950 {
    private static class Node{
        int end;
        int weight;
        public Node(int end, int weight) {
            this.end = end;
            this.weight = weight;
        }
    }
    private static final int INF = 987654321;
    private static int prim(List<Node>[] map,int n,int t){
        int[] distance = new int[n+1];
        boolean[] visited = new boolean[n+1];
        Arrays.fill(distance,INF);
        distance[1] = 0;
        int result = 0;
        for(int i = 0 ; i < n ; i++){
//            System.out.println(result);
            int minValue = INF;
            int minIndex = 0;
            for(int j = 1 ; j <= n ; j++){
                if(!visited[j] && minValue > distance[j]){
                    minValue = distance[j];
                    minIndex = j;
                }
            }
            visited[minIndex] = true;
            result += minValue;
            if(i > 0){
                result += (i-1) * t;
            }
            for(int j = 0 ; j < map[minIndex].size() ; j++){
                Node next = map[minIndex].get(j);
                if(!visited[next.end] && distance[next.end] > next.weight){
                    distance[next.end] = next.weight;
                }
            }
        }
        return result;
    }
    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 t = stoi.apply(st.nextToken());
        List<Node>[] map = new List[n+1];
        for(int i = 0 ; i <= n ; i++){
            map[i] = new ArrayList<>();
        }
        for(int i = 0 ; i < m ; i++){
            st = new StringTokenizer(br.readLine()," ");
            int a = stoi.apply(st.nextToken());
            int b = stoi.apply(st.nextToken());
            int c = stoi.apply(st.nextToken());
            map[a].add(new Node(b,c));
            map[b].add(new Node(a,c));
        }
        System.out.println(prim(map,n,t));
    }
}

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

백준 1766번 문제집 (JAVA)  (0) 2022.02.04
백준 1516번 게임개발 (JAVA)  (0) 2022.02.03
백준 16930번 달리기 (JAVA)  (0) 2022.02.01
백준 2660번 회장뽑기 (JAVA)  (0) 2022.01.31
백준 2138번 전구와 스위치 (JAVA)  (0) 2022.01.30