문제 - https://www.acmicpc.net/problem/17182

 

17182번: 우주 탐사선

우주 탐사선 ana호는 어떤 행성계를 탐사하기 위해 발사된다. 모든 행성을 탐사하는데 걸리는 최소 시간을 계산하려 한다. 입력으로는 ana호가 탐색할 행성의 개수와 ana호가 발사되는 행성의 위

www.acmicpc.net

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

public class Main {

    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static StringBuilder sb = new StringBuilder();
    static StringTokenizer st;

    static int N, K, mintime = 10000;
    static boolean[] visit;
    static int[][] adj, dist;

    public static void main(String[] args) throws Exception {

        st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());
        
        visit = new boolean[N];
        visit[K] = true;
        adj = new int[N][N];
        dist = new int[N][N];
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                adj[i][j] = Integer.parseInt(st.nextToken());
                dist[i][j] = adj[i][j];
            }
        }

        for (int k = 0; k < N; k++) {
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);
                }
            }
        }
        search(K, 0, 1);

        bw.write(mintime+"\n");
        bw.flush();
        bw.close();
        br.close();
    }
    static void search(int s, int time, int visited){
        if(visited==N){
            mintime = Math.min(mintime, time);
            return;
        }

        for (int e = 0; e < N; e++) {
            if(!visit[e]) {
                visit[e] = true;
                search(e, time+dist[s][e], visited+1);
                visit[e] = false;
            }
        }
    }
}

주어진 범위가 크지 않은것을 보고 플로이드워셜 알고리즘을 이용해야 한다는것만 잘 캐치한다면, 무리없이 풀 수 있는 문제였다.

중복방문이 허용된다는 말이 함정일수도있는데, 플로이드워셜을 이용한다면 이미 중복또한 포함되어있기때문에 말그대로 최단거리가 된다.

'공부 > algorithm' 카테고리의 다른 글

BOJ 후보 추천하기(1713) - Java  (0) 2021.10.14
BOJ 가르침(1062) - Java  (0) 2021.10.13
BOJ KCM Travel(10217) - Java  (0) 2021.10.10
BOJ Yonsei TOTO(12018) - Java  (0) 2021.10.04
BOJ A와 B(12904) - Java  (0) 2021.10.04

+ Recent posts