Submission #67637515
Source Code Expand
// Node.js (v18.16.1) における TSP の解法(ビットDP)
// 実行時間制限: 10秒、メモリ制限: 1024MiB
const fs = require('fs');
/**
* 都市巡回セールスマン問題を解く関数
* @param {number} N - 都市の数
* @param {[number, number][]} coords - 都市の座標配列 (X, Y)
* @returns {number} - 最短距離(絶対/相対誤差10^-3未満で正解)
*/
function solveTSP(N, coords) {
const dist = Array.from({ length: N }, () => Array(N).fill(0));
// 距離を前計算
for (let i = 0; i < N; i++) {
for (let j = 0; j < N; j++) {
const dx = coords[i][0] - coords[j][0];
const dy = coords[i][1] - coords[j][1];
dist[i][j] = Math.hypot(dx, dy); // √(dx² + dy²)
}
}
const INF = Infinity;
const dp = Array.from({ length: 1 << N }, () => Array(N).fill(INF));
// 初期位置を全都市として開始(0都市からスタート)
dp[1][0] = 0;
for (let s = 1; s < (1 << N); s++) {
for (let u = 0; u < N; u++) {
if (!(s & (1 << u))) continue;
for (let v = 0; v < N; v++) {
if (s & (1 << v)) continue;
const ns = s | (1 << v);
dp[ns][v] = Math.min(dp[ns][v], dp[s][u] + dist[u][v]);
}
}
}
// 最後に戻る距離を加える
let res = INF;
for (let u = 1; u < N; u++) {
res = Math.min(res, dp[(1 << N) - 1][u] + dist[u][0]);
}
return res;
}
// 入力処理
(function main() {
const input = fs.readFileSync('/dev/stdin', 'utf8').trim().split('\n');
const N = parseInt(input[0], 10);
const coords = input.slice(1).map(line => line.split(' ').map(Number));
const result = solveTSP(N, coords);
// 絶対誤差・相対誤差が 1e-3 未満になるように出力(12桁精度)
console.log(result.toFixed(12));
})();
Submission Info
| Submission Time | |
|---|---|
| Task | B23 - Traveling Salesman Problem |
| User | myoshizumi |
| Language | JavaScript (Node.js 18.16.1) |
| Score | 1000 |
| Code Size | 1854 Byte |
| Status | AC |
| Exec Time | 89 ms |
| Memory | 59600 KiB |
Judge Result
| Set Name | Sample | All | ||||
|---|---|---|---|---|---|---|
| Score / Max Score | 0 / 0 | 1000 / 1000 | ||||
| Status |
|
|
| Set Name | Test Cases |
|---|---|
| Sample | sample_01.txt, sample_02.txt |
| All | in01.txt, in02.txt, in03.txt, in04.txt, in05.txt, in06.txt, in07.txt, in08.txt, in09.txt, in10.txt, in11.txt, in12.txt, in13.txt, in14.txt, sample_01.txt, sample_02.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| in01.txt | AC | 40 ms | 42768 KiB |
| in02.txt | AC | 41 ms | 42728 KiB |
| in03.txt | AC | 41 ms | 42760 KiB |
| in04.txt | AC | 41 ms | 42808 KiB |
| in05.txt | AC | 41 ms | 42628 KiB |
| in06.txt | AC | 41 ms | 42760 KiB |
| in07.txt | AC | 42 ms | 43060 KiB |
| in08.txt | AC | 74 ms | 47276 KiB |
| in09.txt | AC | 46 ms | 47612 KiB |
| in10.txt | AC | 48 ms | 48552 KiB |
| in11.txt | AC | 50 ms | 48596 KiB |
| in12.txt | AC | 55 ms | 49268 KiB |
| in13.txt | AC | 66 ms | 52392 KiB |
| in14.txt | AC | 89 ms | 59600 KiB |
| sample_01.txt | AC | 41 ms | 42680 KiB |
| sample_02.txt | AC | 41 ms | 42680 KiB |