문제 유형
- 플로이드-위셜 알고리즘
문제 접근
- 답
- 모든 행성 방문 최소 시간
- 주어지는 정보
- 맵 크기 최대 100 (N*N)
- 행성 시작 지점(K)
- 후보
- 완전 탐색
- 실패
- 방문한 곳을 재방문 가능함. 따라서, 각 경우의 수마다 방문한 곳을 재방문 하면 무한 반복 발생
- 완전 탐색
- 해결 방법
- 플로이드-와샬 알고리즘
- 모든 정점에서 다른 정점으로의 최단 거리 갱신
- 플로이드-와샬 알고리즘
int[][] graph;
static void floyd(int[][] graph){
for(int k = 0; k<N; k++){
for(int i = 0; i<N; i++){
for(int j = 0; j<N; j++){
graph[i][j] = Math.min(graph[i][j], graph[i][k] + graph[k][j]);
}
}
}
}
시간 계산
- 플로이드
- 101010 = 1000
- 플로이드로 구한 그래프에서 재귀 탐색
- (10-1)! = 362880
- 총합
- 363880 ⇒ 통과
코드
import java.io.*;
import java.util.*;
class Main {
static int N, K;
static int[][] map;
static int[][] graph;
static boolean[] visited;
static int answer = Integer.MAX_VALUE;
static void floyd(){
int MAX = 9999999;
for(int i = 0; i<N; i++){
for(int j = 0; j<N; j++){
graph[i][j] = map[i][j];
}
}
for(int k = 0; k<N; k++){
for(int i = 0; i<N; i++){
for(int j = 0; j<N; j++){
graph[i][j] = Math.min(graph[i][j], graph[i][k] + graph[k][j]);
}
}
}
}
static void dfs(int total, int cur, int cnt){
if(cnt == N){
answer = Math.min(answer, total);
}
for(int i = 0; i<N; i++){
if(visited[i] == true){
continue;
}
visited[i] = true;
dfs(total + graph[cur][i], i, cnt + 1);
visited[i] = false;
}
}
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());
K = Integer.parseInt(st.nextToken());
map = new int[N][N];
graph = new int[N][N];
visited = new boolean[N];
visited[K] = true;
for(int i = 0; i<N; i++){
st = new StringTokenizer(br.readLine());
for(int j = 0; j<N; j++){
map[i][j] = Integer.parseInt(st.nextToken());
}
}
floyd();
dfs(0,K,1);
System.out.println(answer);
}
}
'알고리즘' 카테고리의 다른 글
2022 KAKAO BLIND RECRUITMENT(파괴되지 않은 건물) JAVA (0) | 2024.09.23 |
---|---|
2022 KAKAO BLIND RECRUITMENT(사라지는 발판) (0) | 2024.09.20 |
백준 10836 JAVA (1) | 2024.09.16 |
백준 1917 JAVA (0) | 2024.08.15 |
백준 1113 JAVA (0) | 2024.08.14 |