タイトル:
巡回セールスマンのp1523簡略化
解析が
配置\(F [I] [J ] \) 人は、最短距離のいずれかが歩いJ(I歩い表し\(Iは、Jを\ <) )
の\の(J + 1 \)ポジション、2人は2例は、行く可能性が高いです
- \(F [I] [J + 1] =分\ {F [I] [J + 1]、[I] [J] + DIS [J] [J + 1] \ F} \) 位置j、人々がj + 1つの位置に来ます
- \(F [j]は[J + 1] =分\ {F [j]は[J + 1]、F [i]は[J] + DIS [I]、[J + 1] \} \) の位置I、人々がj + 1つの位置に来ます
コード:
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, m;
double f[N][N], dis[N][N];
struct node {
double x, y;
bool operator <(const node &oth) const {
return x < oth.x;
}
} e[N];
double calc(node a, node b) {
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
int main() {
ios::sync_with_stdio(false);
cin >> n;
for (int i = 1; i <= n; ++i)
cin >> e[i].x >> e[i].y;
sort(e + 1, e + 1 + n);
for (int i = 1; i <= n; ++i)
for (int j = i + 1; j <= n; ++j)
dis[i][j] = calc(e[i], e[j]), f[i][j] = LLONG_MAX;
f[1][2] = dis[1][2];
for (int i = 1; i <= n; ++i)
for (int j = i + 1; j <= n; ++j) {
f[i][j + 1] = min(f[i][j + 1], f[i][j] + dis[j][j + 1]);
f[j][j + 1] = min(f[j][j + 1], f[i][j] + dis[i][j + 1]);
}
double ans = LLONG_MAX;
for (int i = 1; i < n; ++i) ans = min(ans, f[i][n] + dis[i][n]);
printf("%.2lf", ans);
}