[λ°±μ€]10971λ² 'μΈνμ μν2' λ¬Έμ νμ΄ - JavaScript
λ¬Έμ
μΈνμ μν λ¬Έμ λ μμ΄λ‘ Traveling Salesman problem (TSP) λΌκ³ λΆλ¦¬λ λ¬Έμ λ‘ computer science λΆμΌμμ κ°μ₯ μ€μνκ² μ·¨κΈλλ λ¬Έμ μ€ νλμ΄λ€. μ¬λ¬ κ°μ§ λ³μ’ λ¬Έμ κ° μμΌλ, μ¬κΈ°μλ κ°μ₯ μΌλ°μ μΈ ννμ λ¬Έμ λ₯Ό μ΄ν΄λ³΄μ.
1λ²λΆν° Nλ²κΉμ§ λ²νΈκ° λ§€κ²¨μ Έ μλ λμλ€μ΄ μκ³ , λμλ€ μ¬μ΄μλ κΈΈμ΄ μλ€. (κΈΈμ΄ μμ μλ μλ€) μ΄μ ν μΈνμμ΄ μ΄λ ν λμμμ μΆλ°ν΄ Nκ°μ λμλ₯Ό λͺ¨λ κ±°μ³ λ€μ μλμ λμλ‘ λμμ€λ μν μ¬ν κ²½λ‘λ₯Ό κ³ννλ €κ³ νλ€. λ¨, ν λ² κ°λ λμλ‘λ λ€μ κ° μ μλ€. (맨 λ§μ§λ§μ μ¬νμ μΆλ°νλ λμλ‘ λμμ€λ κ²μ μμΈ) μ΄λ° μ¬ν κ²½λ‘λ μ¬λ¬ κ°μ§κ° μμ μ μλλ°, κ°μ₯ μ μ λΉμ©μ λ€μ΄λ μ¬ν κ³νμ μΈμ°κ³ μ νλ€.
κ° λμκ°μ μ΄λνλλ° λλ λΉμ©μ νλ ¬ W[i][j]ννλ‘ μ£Όμ΄μ§λ€. W[i][j]λ λμ iμμ λμ jλ‘ κ°κΈ° μν λΉμ©μ λνλΈλ€. λΉμ©μ λμΉμ μ΄μ§ μλ€. μ¦, W[i][j] λ W[j][i]μ λ€λ₯Ό μ μλ€. λͺ¨λ λμκ°μ λΉμ©μ μμ μ μμ΄λ€. W[i][i]λ νμ 0μ΄λ€. κ²½μ°μ λ°λΌμ λμ iμμ λμ jλ‘ κ° μ μλ κ²½μ°λ μμΌλ©° μ΄λ΄ κ²½μ° W[i][j]=0μ΄λΌκ³ νμ.
Nκ³Ό λΉμ© νλ ¬μ΄ μ£Όμ΄μ‘μ λ, κ°μ₯ μ μ λΉμ©μ λ€μ΄λ μΈνμμ μν μ¬ν κ²½λ‘λ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
첫째 μ€μ λμμ μ Nμ΄ μ£Όμ΄μ§λ€. (2 ≤ N ≤ 10) λ€μ Nκ°μ μ€μλ λΉμ© νλ ¬μ΄ μ£Όμ΄μ§λ€. κ° νλ ¬μ μ±λΆμ 1,000,000 μ΄νμ μμ μ μμ΄λ©°, κ° μ μλ κ²½μ°λ 0μ΄ μ£Όμ΄μ§λ€. W[i][j]λ λμ iμμ jλ‘ κ°κΈ° μν λΉμ©μ λνλΈλ€.
νμ μνν μ μλ κ²½μ°λ§ μ λ ₯μΌλ‘ μ£Όμ΄μ§λ€.
μΆλ ₯
첫째 μ€μ μΈνμμ μνμ νμν μ΅μ λΉμ©μ μΆλ ₯νλ€.
μμ μ λ ₯ 1
4
0 10 15 20
5 0 9 10
6 13 0 12
8 8 9 0
μμ μΆλ ₯ 1
35
π νμ΄ μ½λ
const fs = require('fs');
const file = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = fs.readFileSync(file).toString().trim().split('\n');
const n = Number(input[0]);
const graph = input.slice(1).map((line) => line.split(' ').map(Number));
const visited = new Array(n).fill(false);
let min = 1e9;
function dfs(depth, start, cost) {
if (depth === n - 1 && graph[start][0] !== 0) {
min = Math.min(min, cost + graph[start][0]);
return;
}
for (let i = 0; i < n; i++) {
if (!visited[i] && graph[start][i] !== 0) {
visited[i] = true;
dfs(depth + 1, i, cost + graph[start][i]);
visited[i] = false;
}
}
}
visited[0] = true;
dfs(0, 0, 0);
console.log(min);
π νμ΄ ν΄μ€
λ³Έ λ¬Έμ λ κ° νμλ§λ€ κ°μ₯ μμ λΉμ©μ μ ννλ λͺ¨λ κ²½μ°μ μλ₯Ό κ³ λ₯΄λ λΈλ£¨νΈν¬μ€, λ°±νΈλνΉ μκ³ λ¦¬μ¦μΌλ‘ λ¬Έμ λ₯Ό ν μ μλ€.
- λ¨Όμ μ μΆλ ₯μ λ°μμ nκ³Ό graph λ°°μ΄ λ³μμ λ΄μμ£Όμλ€.
- νλ² λ°©λ¬Έν λμλ μ¬λ°©λ¬Έν μ μκΈ° λλ¬Έμ λ°©λ¬Έν λμλ λ°©λ¬Έ νλ€κ³ 체ν¬νκΈ° μν΄μ visitedλΌλ λ°°μ΄ λ³μλ₯Ό nκΈΈμ΄λ§νΌ falseλ‘ μ΄κΈ°νν΄μ£Όμλ€.
- μ΅μ λΉμ©μ λ΄κΈ° μν λ°°μ΄ min λ³μλ₯Ό μ΅λκ°μΌλ‘ μ΄κΈ°νν΄μ£Όμλ€.
μ΄λ λμμμ μΆλ°μ νλμ§ λͺ¨λ κ²½μ°μ μλ₯Ό νμνμ λ μ΄ μ΄λ λΉμ©μ κ²°κ΅ κ°κΈ° λλ¬Έμ κ° λμ κ°μ μΆλ° μ μ 첫 λ²μ§Έ λμλ₯Ό μΆλ°μ μΌλ‘ μ‘μλ€.
μ¦, graphλ°°μ΄μ 0λ²μ§Έ μΈλ±μ€λΆν° μΆλ°μ νλλ‘ ν΄μ μ²μ dfsλ₯Ό νΈμΆνκΈ° μ μ vistedμ 0λ²μ§Έ μΈλ±μ€λ₯Ό trueλ‘ μ£Όμ΄μ μμμ μλ Έλ€.
dfsμλ 3κ°μ 맀κ°λ³μκ° μλ€.
- nλ§νΌ λμλ₯Ό μννκΈ° μν(depth)
- νμ¬ λμμμ λ€μ λμλ₯Ό μ΄λν μΈλ±μ€(start)
- μ΄λνλ©΄μ λλ λΉμ©(cost)
dfsν¨μμμ μ€λ¨μ μ΄ μ μΌ μ€μνλ°, μ€λ¨μ μ κ²°κ΅ μνμ λ€ λ¬μμ λ μ΄λ€ κ²°κ³Ό κ°μ κ°μ§ κ²μΈμ§λ₯Ό κ²°μ νλ κ³³μ΄λ€.
첫 λ²μ§Έ λμμμ μμνκ³ κ²°κ΅ νμ 첫λ²μ§Έ λμλ‘ λ€μ λμμμΌ νλ€.
depthκ° n-1λ§νΌ λ λ μ€λ¨ ν΄μ£Όλλ‘ νκ³ μ΄ μ€λ¨μ μμ 첫 λ²μ§Έλ‘ λμμ¬ λ λΉμ©μ λν΄μ£Όλ©΄ λλ€.
κ·Έλ¦¬κ³ μ²μ dfsλ₯Ό νΈμΆνμ λ λ°λ‘ μ΄ μ€λ¨μ μΌλ‘ λ€μ΄κ°λ©΄ μ λκΈ° λλ¬Έμ graph[start][0] κ°μ΄ 0μ΄ μλ λ μ€λ¨μ΄ λ μ μλλ‘ ν΄μ£Όμλ€.
κ²°κ³Όμ μΌλ‘ μ΄ μ€λ¨μ μμλ μ΅μ λΉμ©μ ꡬν΄μΌ νλ€.
νμ¬κΉμ§ ꡬν μ΅μ λΉμ© minκ³Ό νμ¬κΉμ§ μ¬κ·λ₯Ό λλ©΄μ ꡬν λΉμ© cost + 첫 λ²μ§Έλ‘ λ€μ λμκ° λμ λΉμ©μ λΉκ΅ν΄μ λ μμ κ°μ min λ³μμ λ΄μμ£Όλλ‘ νλ€.
μμ§ μ€λ¨λ μ‘°κ±΄μ΄ λμ§ μλ λ€λ©΄ forλ¬ΈμΌλ‘ κ°κ² λλλ°,
μ¬κΈ°μλ μμ§ λ°©λ¬Ένμ§ μμκ±°λ λ€μ λμλ‘ μ΄λν μ μμΌλ©΄(λΉμ©μ΄ 0μ΄ μλλ©΄) νμ¬ μΈλ±μ€λ₯Ό λ°©λ¬Έμ²λ¦¬ ν΄μ£Όκ³ dfsν¨μμ depthλ₯Ό 1 μ¦κ°μμΌ μ£Όκ³ μ°λ¦¬κ° λ€μ κ°μΌ ν λμ
μ¦, νμ¬ μΈλ±μ€λ₯Ό startλ‘ μ£Όκ³ , μ΄λν λ λλ λΉμ©μ λν΄μ μ¬κ·ν¨μλ₯Ό νΈμΆν΄ μ€λ€.
μνμ΄ λλλ©΄ λ°©λ¬Έ μ²λ¦¬λ₯Ό ν΄μ ν΄μ£Όλλ‘ νλ€.
λ§μ§λ§μΌλ‘ μ§κΈκΉμ§ μ΅μκ°μ ꡬν minμ μΆλ ₯ν΄ μ€μΌλ‘μ¨ ν΄κ²°ν΄ μ€ μ μλ€.