백준 10971번 외판원 순회 2 Java

: ) YOUNG·2024년 8월 8일
1

알고리즘

목록 보기
391/422
post-thumbnail

백준 10971번 외판원 순회 2 Java

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

문제



생각하기


  • 백트래킹을 활용한 최단 거리 순환 문제이다.

  • 기본기를 배우기 좋은 문제인 것 같음



동작



결과


코드



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

public class Main {

    // input
    private static BufferedReader br;

    // variables
    private static int N, ans;
    private static int[][] arr;
    private static boolean[] isVisited;
    private static final int INF = Integer.MAX_VALUE;

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

        input();

        bw.write(solve());
        bw.close();
    } // End of main()

    private static String solve() {
        StringBuilder sb = new StringBuilder();
        isVisited[0] = true;
        DFS(0, 0, 0, 0);

        sb.append(ans);
        return sb.toString();
    } // End of solve()

    private static void DFS(int start, int cur, int depth, int sum) {
        if (depth == N - 1) {
            if (arr[cur][start] != 0) {
                ans = Math.min(ans, sum + arr[cur][start]);
            }
            return;
        }

        for (int i = 0; i < N; i++) {
            if (isVisited[i] || arr[cur][i] == 0) continue;
            isVisited[i] = true;
            DFS(start, i, depth + 1, sum + arr[cur][i]);
            isVisited[i] = false;
        }
    } // End of DFS()

    private static void input() throws IOException {
        N = Integer.parseInt(br.readLine());

        arr = new int[N][N];
        ans = INF;
        isVisited = new boolean[N];
        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }
    } // End of input()
} // End of Main class

0개의 댓글