반응형
해밀턴 순환회로, A정점에서 시작하여 모든 정점을 최소비용으로 돌아 A정점으로 돌아오는 문제이다.
다른 말로는 TSP, 외판원 순환 문제라고 한다. 이 문제는 다양한 풀이 방법으로 접근 할 수 있지만 N의 값이 12 이하로 주어졌으므로 백트래킹을 이용한 완탐을 사용해보았다. 단, 순열의 완탐을 돌때 첫번째 점(0)을 제외한 N-1개의 순열을 구하고 이때 마지막에 해당하는 점에서 첫번째점(0)으로의 경로가 존재하는 경우 최종답을 확인해주는 방식으로 구해준다. 또한 방문시에 최저값을 갱신할수 있을때만 방문하는 조건을 사용하여 시간을 줄였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
package jungol;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_jo_1681_해밀턴순환회로 {
static int N;
static int[][] map;
static boolean[] visit;
static int answer;
public static void main(String[] args) throws Exception {
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st= null;
N=Integer.parseInt(br.readLine());
map=new int[N][N];
visit=new boolean[N];
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());
}
visit[0]=true;
answer=Integer.MAX_VALUE;
perm(0,1,0);
System.out.println(answer);
}
static void perm(int cur,int depth, int sum) {
if(depth==N) {
if(map[cur][0]==0)
return;
sum+=map[cur][0];
answer=Math.min(answer, sum);
return;
}
for(int i=1;i<N;i++) {
if(visit[i]==false && map[cur][i]!=0 && sum+map[cur][i] < answer) {
visit[i]=true;
perm(i,depth+1,sum+map[cur][i]);
visit[i]=false;
}
}
}
}
|
반응형
'Algorithm' 카테고리의 다른 글
[Programmers] 후보키 (0) | 2020.05.08 |
---|---|
[Programmers] 캐시 (0) | 2020.05.08 |
[BOJ] 4195. 친구 네트워크 (0) | 2020.05.07 |
[BOJ] 17472. 다리 만들기2 (0) | 2020.05.07 |
[BOJ] 6987. 월드컵 (0) | 2020.05.06 |