λ°μν
λ¬Έμ λΆμ
체ν¬ν΄μΌ ν κ²
- μλ₯Ό λ€μ΄, 4λͺ μ μ μλ₯Ό ν A, B λ‘ λλ΄μ λ -> λͺ¨λ κ²½μ°μ ν ꡬμ±μ ꡬν λ€, κ·Έ νμ λ₯λ ₯μΉλ₯Ό λ€ λν΄μ μ°¨μ΄κ° κ°μ₯ μμ κ°μ μΆλ ₯ νλ©΄ λλ€.
- μ°¨μ΄κ° 0μ΄ λλ©΄ λμ΄μ λ€λ₯Έ κ²½μ°μ μλ₯Ό λ°μ Έλ³΄μ§ μμλ λλ€. (μκ° λ³΅μ‘λ μ€μ΄κΈ°)
ν μ νκΈ°
- μ μ 1, 2, 3, 4κ° μλ€κ³ νλ©΄, κ° νμλ 2λͺ
μ© λλλ©΄ λλ€.
- μλ₯Ό λ€μ΄, ν Aμ μ μ(1, 2)κ° μμΌλ©΄, μλμΌλ‘ λλ¨Έμ§ ν Bμλ (3, 4)κ° λ€μ΄κ°λ κ²μ΄λ€.
1, 2, 3, 4 μ€μ ν A μ (1,2) (1,3) (1,4) (2,3) (2,4) (3,4) μ΄λ° μμΌλ‘ κ°λ₯νλ€. ν B λ μλμΌλ‘ λλ¨Έμ§ μ μλ€μ΄ λλ―λ‘, μ’ λ£ μ‘°κ±΄μμ λ°λ‘ μ²λ¦¬ν΄μ£Όλ©΄ λλ€.
κ·ΈλΌ μ¬κ· ν¨μλ₯Ό ꡬνν λ, λ°λ³΅λ¬Έμ λͺ¨λ μ μμ μ λ° νμλ§ λλ©΄μ depth λ₯Ό 1μ© μΆκ°νλ©΄μ μ¬κ· νΈμΆ νλ©΄ λκ² λ€.
μ΄λ²μλ νμ μ¬μ©νλμ§ μ²΄ν¬νλ boolean[] isUsed; λ₯Ό μ¬μ©ν κ²μ΄λ€.
int[] team_star = new int[N/2]; // Star ν
int[] team_link = new int[N/2]; // Link ν
boolean[] isUsed = new boolean[N]; // μ μ μ¬μ© μ¬λΆ
μ¬κ· ν¨μ ꡬν
private static void dfs(int index) {
/* μ’
λ£ μ‘°κ±΄ */
if (index == N / 2) { // indexκ° N/2κ° λλ©΄ μ’
λ£!
int idx = 0;
for (int i = 0; i < N; i++) {
/* λλ¨Έμ§ μ μλ€ linkνμ λ£κΈ°! */
if (!isContains(i)) { // starνμ΄ μλ λ©€λ²λ§ linkνμ μΆκ°!
team_Link[idx++] = i;
}
}
check_team_stat(); // νμ λ₯λ ₯μΉ μ°¨μ΄ μ΅μ κ°μ ꡬνλ λ©μλ νΈμΆ!
return;
}
for (int i = 0; i < N; i++) {
if (!isUsed[i]) { // λ°©λ¬Έ μν iλ§
isUsed[i] = true;
team_star[index] = i; // λ¨Όμ starνμ λ£μ΄μ€λ€. μ¬κ·μ depthκ° indexκ° λλ€.
dfs(index + 1); // λ€μ λ€μ λ©€λ²λ₯Ό λ½κΈ° μν΄ μ¬κ· νΈμΆ
for (int j = i + 1; j < N; j++) {
isUsed[j] = false; // (1,2) μ (2,1) κ°μ μ€λ³΅μ νΌνκΈ° μν΄ νμ¬ iκ° μ΄νλ‘λ§ false μ²λ¦¬ ν΄μ€λ€.
}
}
}
}
/* νμ λ₯λ ₯μΉλ₯Ό κ³μ°ν΄μ μ΅μ κ°μ ꡬνλ λ©μλ */
private static void check_team_stat() {
int result1 = 0;
int result2 = 0;
for (int i : team_star) {
for (int j : team_star) {
result1 += status[i][j];
}
}
for (int i : team_Link) {
for (int j : team_Link) {
result2 += status[i][j];
}
}
int n = Math.abs(result1 - result2);
// λ₯λ ₯ μ°¨μ΄κ° 0μ΄λ©΄ λμ΄μ μ΅μ κ°μ ꡬν νμκ° μκΈ° λλ¬Έμ
// 0μ μΆλ ₯μν€κ³ , μ’
λ£ νλ©΄ λλ€.
if (n == 0) {
System.out.println(0);
System.exit(0);
} else {
// n = n >= 0 ? n : -n;
MIN = Math.min(MIN, n);
}
}
/* star νμ μν λ©€λ²μΈμ§ 체ν¬νλ λ©μλ */
private static boolean isContains(int id) {
for (int i : team_star) {
if (i == id) return true;
}
return false;
}
μ 체 μ½λ
λ°μν