1+ import java .io .BufferedReader ;
2+ import java .io .IOException ;
3+ import java .io .InputStreamReader ;
4+ import java .lang .reflect .Array ;
5+ import java .util .Arrays ;
6+ import java .util .StringTokenizer ;
7+
8+
9+ public class Main {
10+ static int [][] tsp ;
11+ static int n ;
12+ public static void main (String [] args ) throws IOException {
13+ BufferedReader br =new BufferedReader (new InputStreamReader (System .in ));
14+ n = Integer .parseInt (br .readLine ());
15+ StringTokenizer st ;
16+ tsp = new int [n ][n ];
17+ for (int i = 0 ; i < n ; i ++) {
18+ st = new StringTokenizer (br .readLine ());
19+ int j =0 ;
20+ while (st .hasMoreTokens ()){
21+ tsp [i ][j ]=Integer .parseInt (st .nextToken ());
22+ j ++;
23+ }
24+ }
25+ long [][] dp = new long [n ][(1 <<n )-1 ];
26+ for (int i = 0 ; i < n ; i ++) {
27+ Arrays .fill (dp [i ],Integer .MAX_VALUE );
28+ }
29+ System .out .println (TSP (dp , 0 ,1 ));
30+
31+ }
32+ private static long TSP (long [][] dp , int city , int bit ){
33+ if (bit ==((1 <<n )-1 )){ // 1을 왼쪽으로 1비트씩 5번이동 ex) 1 << 4 = 10000(2) = 16 -> 우리의 최대값 : 1111(2) 이므로 1 빼기
34+ if (tsp [city ][0 ]==0 ){
35+ return Integer .MAX_VALUE ;
36+ }
37+ return tsp [city ][0 ];
38+
39+ }
40+ if (dp [city ][bit ]!=Integer .MAX_VALUE ){
41+ return dp [city ][bit ];
42+ }
43+ for (int i = 0 ; i < n ; i ++) { // 현재 도시(city)에서 각 i의 도시로 이동한 경우에 대해 DFS 수행
44+ if ((bit & (1 <<i ))==0 && tsp [city ][i ]!=0 ){//다시 그 도시를 방문하는 경우 예외처리
45+ dp [city ][bit ]=Math .min (dp [city ][bit ],TSP (dp , i , bit |(1 <<i ))+tsp [city ][i ]);
46+ }
47+ }
48+ return dp [city ][bit ];
49+ }
50+ }
0 commit comments