[μκ³ λ¦¬μ¦ PS] λ°±μ€ 10971λ² μΈνμ μν 2 μλ° λ¬Έμ νμ΄
λ¬Έμ
ν΄λΉ ν¬μ€ν μ λ°±μ€μ 10971λ² μΈνμ μν 2 μ μ κ·Όκ³Ό ν΄κ²° λ°©λ²μ μ€λͺ ν κΈ μ λλ€.
μ λ΅ μμ€ μ½λλ₯Ό νμΈνμλ €λ©΄ solve url μμ νμΈ κ°λ₯ν©λλ€.
10971λ²: μΈνμ μν 2
첫째 μ€μ λμμ μ Nμ΄ μ£Όμ΄μ§λ€. (2 ≤ N ≤ 10) λ€μ Nκ°μ μ€μλ λΉμ© νλ ¬μ΄ μ£Όμ΄μ§λ€. κ° νλ ¬μ μ±λΆμ 1,000,000 μ΄νμ μμ μ μμ΄λ©°, κ° μ μλ κ²½μ°λ 0μ΄ μ£Όμ΄μ§λ€. W[i][j]λ λμ iμμ j
www.acmicpc.net
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μ΄λ€ λ°©μμΌλ‘ μ κ·Όν΄μΌ νλμ§λ₯Ό λ¨Όμ μκ°ν΄λ³΄μ.
λ¬Έμ μ κ·Ό
μ΄λ² λ¬Έμ λ CS λΆμΌμμ μ λͺ ν λ¬Έμ λΌκ³ νλ€.
μ΄ λ¬Έμ μ ν΅μ¬μ λ€μκ³Ό κ°λ€.
n by n νλ ¬μμ (n, m)μ νΉμ arr[n][m]
μ nμμ mμΌλ‘ κ°λ λΉμ© μ΄λ€.
μ°λ¦¬λ μ΄ λΉμ©μ μ΅μνν΄μΌ νλ€.
μλμ κ°μ΄ 4 x 4 νλ ¬μ΄ μλ€λ©΄
0 1 2 1
3 0 3 2
1 2 0 1
2 1 2 0
0 -> 1 1 -> 2 2 -> 3 3 -> 0 // μ΄λ κ² κ°λ
1 -> 3 3 -> 2 2 -> 0 0 -> 1 // νΉμ μ΄λ κ² κ°λ μκ΄ μμ
μ΄λ»κ² κ°λ λͺ¨λ λμλ§ λ€ λ°©λ¬Ένλ©΄ λλ€.
κ·ΈλΌ λͺ¨λ λμλ₯Ό λ€ λ°©λ¬Ένλ €λ©΄ μμ΄μ μ΄μ©νλ©΄ λ κ² κ°λ€.
νμ§λ§ μμ΄ μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λκ° N * N!
κ° λλ€.
N * N!
λ μ ν μμ§ μμ μκ° λ³΅μ‘λμ΄λ μ΅μ
μ κ²½μ°κΉμ§ κ³μ°ν΄λ΄μΌ νλλ°, 10 * 10! = 36,288,000
μΌλ‘ 2μ΄ λ΄μ ν΄κ²°ν μ μλ μΆ©λΆν μμ΄ λλ€.
κ·ΈλΌ μ°λ¦¬λ λμλ₯Ό λ°©λ¬Ένλ μμλ₯Ό μμ΄λ‘μ¨ λνλ΄κ³ κ·Έ κ°μ€μΉλ€λ§ κ³μ°ν΄μ£Όλ©΄ μνμ νμν μ΅μ λΉμ©μ μ°Ύμ μμμ κ² κ°λ€.
ν΄κ²°λ²
λͺ¨λ μμ΄μ ꡬνκΈ° μν΄μ μ°λ¦¬λ Next Permutationμ μ΄μ©ν κ²μ΄λ€.
private static boolean nextPermutation(int[] arr) {
int i = arr.length-1;
while(i > 0 && arr[i-1] >= arr[i]) i--;
if(i <= 0) return false;
int j = arr.length-1;
while(arr[j] <= arr[i-1]) j--;
swap(arr, i-1, j);
j = arr.length - 1;
while(i < j) {
swap(arr, i, j);
i++;
j--;
}
return true;
}
private static void swap(int[] arr, int index1, int index2) {
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
μ€λ΅ ν보
μ΄ λ¬Έμ μμ κ°μ₯ μ£Όμν΄μΌ νλ κ²μ λ°λ‘ μ΄κ²μ΄λ€.
i λμμμ j λμλ‘ κ° μ μλ κ²½μ°λ μ‘΄μ¬νλ€. νμ§λ§ μ°λ¦¬λ λͺ¨λ λμλ₯Ό λμμΌ νλ€.
κ·ΈλΌ i λμμμ j λμλ‘ λͺ» κ°λ κ²½μ°, μλ₯Ό λ€λ©΄ 0 -> 1, 1 -> 2
λ§μ λλλ κ²½μ°κ° μμΌλ©΄ μ΄ κ²μ μ λ΅μ΄ λ μ μλ€.
μ? λͺ¨λ λμλ₯Ό λ°©λ¬Ένμ§ μμκΈ° λλ¬Έ.
νμ§λ§ μ΄ κ²½μ°μ νν°λ§μ ν΄μ£Όμ§ μλλ€λ©΄ λͺ¨λ λμλ₯Ό λ°©λ¬Ένμ§ μμλ μ΅μ κ°μ΄ μΆλ ₯λ μ μλ€.
κ·Έλ¬λ―λ‘ μ΄μ μ μνμ
μ λ΅ μ½λ
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int[][] map;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
map = new int[n][n];
int[] country = new int[n];
for (int i = 0; i < n; i++) {
country[i] = i;
for (int j = 0; j < n; j++) {
map[i][j] = input.nextInt();
}
}
int answer = Integer.MAX_VALUE;
do {
int sum = 0;
boolean flag = false;
for (int i = 0; i < country.length - 1; i++) {
if(map[country[i]][country[i+1]] == 0) flag = true;
else sum += map[country[i]][country[i+1]];
}
int value = map[country[country.length - 1]][country[0]];
if(!flag && value != 0) {
sum += value;
answer = Math.min(answer, sum);
}
}while(nextPermutation(country));
System.out.println(answer);
}
private static boolean nextPermutation(int[] arr) {
int i = arr.length - 1;
while(i > 0 && arr[i-1] >= arr[i]) i--;
if(i <= 0) return false;
int j = arr.length - 1;
while(arr[i-1] >= arr[j]) j--;
swap(arr, i-1, j);
j = arr.length - 1;
while(i < j) {
swap(arr, i, j);
i++;
j--;
}
return true;
}
private static void swap(int[] arr, int index1, int index2) {
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
}