publicclassExam10971{ // 다음 순열을 구하는 next_permutation() 함수 publicstaticbooleannext_permutation(int[] a){ int i = a.length-1; while(i>0 && a[i-1]>=a[i]) { i--; } if(i<=0) { returnfalse; } int j = a.length-1; while(a[j]<=a[i-1]) { j--; } int tmp = a[i-1]; a[i-1] = a[j]; a[j] = tmp; j = a.length-1; while(i<j) { tmp = a[i]; a[i] = a[j]; a[j] = tmp; i++; j--; } returntrue; }
publicstaticvoidmain(String[] args)throws NumberFormatException, IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); int test_case = Integer.parseInt(bf.readLine()); int[][] cost = newint[test_case][test_case]; // i에서 j로 가기 위한 비용 for(int i=0;i<test_case;i++) { for(int j=0;j<test_case;j++) { StringTokenizer st = new StringTokenizer(bf.readLine(), " "); cost[i][j] = Integer.parseInt(st.nextToken()); } } int[] city = newint[test_case]; for(int i=0;i<test_case;i++) { city[i] = i; // 도시를 의미 } int ans = Integer.MAX_VALUE; do { boolean possible = true; int sum = 0; for(int i=0;i<test_case-1;i++) { if(cost[city[i]][city[i+1]] == 0) { possible = false; }else { sum += cost[city[i]][city[i+1]]; } } if(possible == true && cost[city[test_case-1]][city[0]] !=0) { // 다음 도시로 갈 수 있고, 처음 도시로 돌아갈 수 있다면 sum+=cost[city[test_case-1]][city[0]]; if(ans>sum) ans = sum; } }while(next_permutation(city)); System.out.println(ans); }