P1433 吃奶酪 状压dp
作者:
多米尼克領主的致意
,
2024-05-21 16:53:09
,
所有人可见
,
阅读 5
状态表示f[s][j] 表示在集合S中以j为终点的最小距离
#include <bits/stdc++.h>
using namespace std;
int n;
double x[20], y[20];
double f[1 << 19][20];
double dist[20][20];
double distance(int a, int b){
return sqrt((x[a] - x[b]) * (x[a] - x[b]) + (y[a] - y[b]) * (y[a] - y[b]));
}
int main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);
// cout.tie(0);
cin >> n;
for(int i = 1;i <= n;i++){
cin >> x[i] >> y[i];
}
memset(f, 127, sizeof f);
for(int i = 0;i <= n;i++){
for(int j = 0;j <= n;j++){
dist[i][j] = distance(i, j);
dist[j][i] = dist[i][j];
}
}
for(int i = 0;i <= n;i++){
f[1 << i][i] = dist[0][i];
}
for(int s = 0; s < (1 << n + 1);s++){
for(int j = 0;j <= n;j++){
if((s >> j) & 1){
for(int k = 0;k <= n;k++){
if((s^(1 << j) >> k) & 1){
f[s][j] = min(f[s][j], f[s^(1 << j)][k] + dist[j][k]);
}
}
}
}
}
double mn = f[0][0];
// cout << mn << endl;
for(int i = 0;i <= n;i++){
// cout << f[(1 << n + 1) - 1][i] << endl;
mn = min(mn, f[(1 << n + 1) - 1][i]);
}
printf("%.2f", mn);
return 0;
}