都快跟第一篇题解一摸一样了,为什么还是不过
查看原帖
都快跟第一篇题解一摸一样了,为什么还是不过
999274
CNS_5t0_0r2楼主2023/10/24 18:17
#include<bits/stdc++.h>
using namespace std;
const int N = 20,M = 34000;
int n;
struct pos{
	double x,y;
} p[N];
double e[N][N];
double f[M][N];
double sq(double t){
	return t * t;
}
double dist(pos p1,pos p2){
	return sqrt(sq(p1.x - p2.x) + sq(p1.y - p2.y));
}
double ans;
int main(){
	memset(f,0x7f,sizeof f);
	ans = f[0][0];
	scanf("%d", &n);
	for(int i = 1;i <= n;i++)
		scanf("%lf%lf", &p[i].x, &p[i].y);
	for(int i = 0;i <= n;i++)
		for(int j = i + 1;j <= n;j++)
			e[i][j] = e[j][i] = dist(p[i],p[j]);
	for(int i = 1;i <= n;i++)
		f[i][(1 << (i - 1))] = e[0][i];
	for(int k = 1;k < (1 << n);k++){
		for(int i = 1;i <= n;i++){
			if((k & (1 << (i - 1))) == 0)
				continue;
			for(int j = 1;j <= n;j++){
				if(i == j)
					continue; 
				if((k & (1 << (j - 1))) == 0)
					continue; 
				f[i][k] = min(f[i][k],f[j][k - (1 << (i - 1))] + e[i][j]);
			}
		} 
	}
	for(int i = 1;i <= n;i++)
		ans = min(ans,f[i][(1 << n) - 1]);
	printf("%.2lf",ans);
	return 0;
}
2023/10/24 18:17
加载中...