Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

전공공부

[BOJ_1774] 우주신과의 교감 본문

Study/Problem Solving

[BOJ_1774] 우주신과의 교감

monitor 2024. 1. 13. 13:33

설명


자료형 때문에 꽤나 애 먹었던 문제다. long 캐스팅이 잘 안 되어서 오래걸렸다. Prim 알고리즘을 사용했고 입력으로 들어오는 값은 거리를 구하는 것에 사용하고 list의 인덱스는 거리가 입력으로 들어오는 순서에 따라서 지정을 하고 이에 따른 거리값을 weight 값으로 넣었다.

 

 

코드


package MST;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class BOJ_1774 {
    static class Data implements Comparable<Data>{
        int x;
        double y;
        public Data(int x, double y){
            this.x = x;
            this.y = y;
        }
        @Override
        public int compareTo(Data o) {
            return Double.compare(this.y, o.y);
        }
    }
    static boolean visited[];
    static List<Data>[] list;
    static int N,M;
    public static void main(String[] args) throws Exception{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tk = new StringTokenizer(in.readLine()," ");
        N = Integer.parseInt(tk.nextToken());
        M = Integer.parseInt(tk.nextToken());
        int[] x = new int[N];
        int[] y = new int[N];

        list = new ArrayList[N + 1];
        visited = new boolean[N + 1];
        for (int i = 0; i <= N; i++){
            list[i] = new ArrayList<>();
        }

        for (int i = 0; i < N; i++){
            tk = new StringTokenizer(in.readLine()," ");
            x[i] = Integer.parseInt(tk.nextToken());
            y[i] = Integer.parseInt(tk.nextToken());
        }

        for (int i = 0; i < N; i++){
            for (int j = i + 1; j < N; j++){
                long distX = (long) (Math.abs(x[i] - x[j])) * (Math.abs(x[i] - x[j]));
                long distY = (long) (Math.abs(y[i] - y[j])) * (Math.abs(y[i] - y[j]));
                double dist = Math.sqrt(distY + distX);
                list[i].add(new Data(j , dist));
                list[j].add(new Data(i , dist));
            }
        }
        for (int i = 0; i < M; i++){
            tk = new StringTokenizer(in.readLine()," ");
            int to = Integer.parseInt(tk.nextToken());
            int from = Integer.parseInt(tk.nextToken());
            list[to - 1].add(new Data(from - 1 , 0.0));
            list[from - 1].add(new Data(to - 1 , 0.0));
        }
        double res = Prim();
        System.out.printf("%.2f\n", res);
    }
    private static double Prim(){
        PriorityQueue<Data> q = new PriorityQueue<Data>();
        double res = 0.0;

        q.offer(new Data(0, 0.0));
        while(!q.isEmpty()) {
            Data cur = q.poll();
            if(visited[cur.x]) {
                continue;
            }
            visited[cur.x] = true;
            res += cur.y;
            for (int j = 0; j < list[cur.x].size(); j++) {
                if(!visited[list[cur.x].get(j).x]) {
                    q.offer(new Data(list[cur.x].get(j).x,list[cur.x].get(j).y));
                }
            }
        }
        return res;
    }
}

 

 

1774번: 우주신과의 교감

(1,1) (3,1) (2,3) (4,3) 이렇게 우주신들과 황선자씨의 좌표가 주어졌고 1번하고 4번이 연결되어 있다. 그렇다면 1번하고 2번을 잇는 통로를 만들고 3번하고 4번을 잇는 통로를 만들면 신들과 선자씨끼

www.acmicpc.net

 

'Study > Problem Solving' 카테고리의 다른 글

[BOJ_14621] 나만 안되는 연애  (0) 2024.01.14
[BOJ_21924] 도시건설  (1) 2024.01.13
[BOJ_16398] 행성 연결  (0) 2024.01.10
[BOJ_1647] 도시 분할 계획  (0) 2024.01.08
[BOJ_20442] ㅋㅋ루ㅋㅋ  (0) 2024.01.07