Scroll indicator done
728x90

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

 

21278번: 호석이 두 마리 치킨

위의 그림과 같이 1번과 2번 건물에 치킨집을 짓게 되면 1번부터 5번 건물에 대해 치킨집까지의 왕복 시간이 0, 0, 2, 2, 2 로 최소가 된다. 2번과 3번 건물에 지어도 동일한 왕복 시간이 나오지만 더

www.acmicpc.net

 

 

코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int n, m, min;
    static int a, b;
    static int[][] arr;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());

        arr = new int[n + 1][n + 1];
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                arr[i][j] = 101;
            }
        }

        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            arr[a][b] = 1;
            arr[b][a] = 1;
        }

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                for (int k = 1; k <= n; k++) {
                    if (i == j || j == k) continue;
                    arr[j][k] = Math.min(arr[j][k], arr[j][i] + arr[i][k]);
                }
            }
        }

        min = Integer.MAX_VALUE;
        dfs(1, 0, new ArrayList<>());
        System.out.println(a + " " + b + " " + min);
    }

    public static void dfs(int start, int cnt, List<Integer> list) {
        if (cnt == 2) {
            int sum = getSum(list);
            if (min > sum) {
                min = sum;
                a = list.get(0);
                b = list.get(1);
            }
            return;
        }

        for (int i = start; i <= n; i++) {
            list.add(i);
            dfs(i + 1, cnt + 1, list);
            list.remove(list.size() - 1);
        }
    }

    public static int getSum(List<Integer> list) {
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            if (list.contains(i)) continue;
            int tmp = Math.min(arr[i][list.get(0)], arr[i][list.get(1)]) * 2;
            sum += tmp;
        }

        return sum;
    }
}

 

728x90

'BAEKJOON > Java' 카테고리의 다른 글

[B16637][괄호 추가하기][java]  (0) 2024.06.01
[B2688][줄어들지 않아][java]  (0) 2024.06.01
[B14501][퇴사][java]  (0) 2023.10.10
[B16508][전공책][java]  (0) 2023.10.10
[B1503][비슷한 단어][java]  (0) 2023.10.10