📙 Algorithm Solving/Java

📙[Algo] 24.04.26 알고리즘

혜덕hyeduck 2024. 4. 26. 14:16

알고리즘 문제) BOJ 14621. 나만 안되는 연애

 

14621번: 나만 안되는 연애

입력의 첫째 줄에 학교의 수 N와 학교를 연결하는 도로의 개수 M이 주어진다. (2 ≤ N ≤ 1,000) (1 ≤ M ≤ 10,000) 둘째 줄에 각 학교가 남초 대학교라면 M, 여초 대학교라면 W이 주어진다. 다음 M개의

www.acmicpc.net

문제 요약

  • 아래 조건을 만족하는 경로의 총 길이 구하기
    • 남초 대학교와 여초대학교를 연결하는 도로로만 구성
    • 어떤 대학교에서든 모든 대학교로 이동 가능해야함
    • 최단 거리가 될 것

시간 제한

  • 2초

입력

  • 학교 수 N, 도로 수 M
    • 2 ≤ N ≤ 1000
    • 1 ≤ M ≤ 10000
  • 각 학교가 남초 대학교면 M, 여초 대학교면 W
  • M개의 줄에 u v d가 주어짐
    • u학교와 v학교가 연결되어있으며, 거리가 d
    • 1 ≤ u,v ≤ N, 1 ≤ d ≤ 1000

출력

  • 조건을 만족하는 경로의 총 길이 출력
  • 만약 모든 학교를 여결하는 경로가 없다면 -1 출력

접근법

  • 남초대와 여초대를 인접시키며, MST를 구성하는 문제

코드

import java.io.*;
import java.util.*;

public class Main {
    static int N, M;
    static char[] info;
    static int[] parent;
    static int[][] graph;

    static int find(int x) {
        if (parent[x] == x) return x;

        parent[x] = find(parent[x]);
        return parent[x];
    }

    static void union(int a, int b) {
        a = find(a);
        b = find(b);

        if (a == b) return;

        parent[b] = a;
    }


    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        st = new StringTokenizer(br.readLine());
        info = new char[N + 1];
        for (int i = 1; i < N + 1; i++) {
            info[i] = st.nextToken().charAt(0);
        }

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

        graph = new int[M][3];
        int v1, v2, d;
        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            v1 = Integer.parseInt(st.nextToken());
            v2 = Integer.parseInt(st.nextToken());
            d = Integer.parseInt(st.nextToken());

            graph[i][0] = v1;
            graph[i][1] = v2;
            graph[i][2] = d;
        }

        Arrays.sort(graph, new Comparator<int[]>(){
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[2] - o2[2];
            }
        });

        int cnt = 1, answer = 0;
        for (int i = 0; i < M; i++) {
            v1 = graph[i][0];
            v2 = graph[i][1];
            d = graph[i][2];

            if (find(v1) == find(v2)) continue;

            if (info[v1] == info[v2]) continue;

            union(v1, v2);
            cnt++;
            answer += d;
        }

        if (cnt < N) bw.write("-1");
        else bw.write(String.valueOf(answer));

        bw.flush();
        bw.close();
        br.close();
    }
}