문제 - 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 |