AOJ-DPL2-A: Traveling Salesman Problem
問題
解説
巡回セールスマン問題を解く.
実装例
C++
- submission: https://onlinejudge.u-aizu.ac.jp/status/users/kira924age/submissions/1/DPL_2_A/judge/5936929/C++11
cpp
#include <iostream>
#include <vector>
long long
traveling_salesman_problem(const int start_vertex,
const std::vector<std::vector<long long>> &G) {
const long long LINF = 1000000000000000018;
const int n = G[0].size();
std::vector<std::vector<long long>> dp((1 << n),
std::vector<long long>(n, LINF));
dp[0][start_vertex] = 0;
for (int S = 0; S < (1 << n); S++) {
for (int v = 0; v < n; v++) {
for (int u = 0; u < n; u++) {
if ((S >> u) & 1) {
continue;
}
dp[S | (1 << u)][v] = std::min(dp[S | (1 << u)][v], dp[S][u] + G[u][v]);
}
}
}
return dp[(1 << n) - 1][start_vertex];
}
int main() {
int n, m;
std::cin >> n >> m;
const long long LINF = 1000000000000000018;
std::vector<std::vector<long long>> G(n, std::vector<long long>(n, LINF));
for (int i = 0; i < m; i++) {
long long s, t, d;
std::cin >> s >> t >> d;
G[s][t] = d;
}
long long ans = LINF;
for (int sv = 0; sv < n; sv++) {
ans = std::min(ans, traveling_salesman_problem(sv, G));
}
if (ans == LINF) {
ans = -1;
}
std::cout << ans << "\n";
return 0;
}
Python
- submission: https://onlinejudge.u-aizu.ac.jp/status/users/kira924age/submissions/1/DPL_2_A/judge/5936976/Python3
テストケースが弱いので開始頂点が 0 のときだけを考えればジャッジを通る. Python だと開始頂点を全探索すると TLE となる.
python
#!/usr/bin/env python3
def traveling_salesman_problem(start_vertex, graph):
n = len(graph)
dp = [[float("inf")] * n for _ in range(1 << n)]
for v in range(n):
if v == start_vertex:
continue
dp[1 << v][v] = graph[start_vertex][v]
for bit in range(1 << n):
for v in range(n):
if (bit >> v) & 1:
continue
for u in range(n):
if not ((bit >> u) & 1):
continue
dp[bit | (1 << v)][v] = min(dp[bit | (1 << v)][v],
dp[bit][u] + graph[u][v])
return dp[(1 << n) - 1][start_vertex]
n, m = map(int, input().split())
graph = [[float("inf")] * n for _ in range(n)]
for _ in range(m):
s, t, d = map(int, input().split())
graph[s][t] = d
ans = traveling_salesman_problem(0, graph)
if ans == float("inf"):
ans = -1
print(ans)