巨大问题
  • 板块P1433 吃奶酪
  • 楼主imfkwk
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/1/17 14:41
  • 上次更新2023/11/5 04:44:17
查看原帖
巨大问题
389540
imfkwk楼主2021/1/17 14:41
#include <bits/stdc++.h>
using namespace std;

struct xy{
	double x;
	double y;
}p[20];

double dis[20][20];

double ds(xy a, xy b) {
	double xx = a.x - b.x;
	double yy = a.y - b.y;
	return sqrt(xx * xx + yy * yy);
}

int n;

double f[20][32768];
double ans;

int main(void) {
	cin >> n;
	for (int i = 1; i<= n; i++) {
		cin >> p[i].x;
		cin >> p[i].y;
	}
	
	p[0].x = 0;
	p[0].y = 0;
	
	for (int i = 0; i<= n; i++) {
		for (int j = i + 1; j <= n; j++) {
			dis[i][j] = dis[j][i] = ds(p[i], p[j]);
		}
	}
	
	for (int i = 0; i <= n; i++)
	for (int j = 0; j <= n; j++)
	f[i][j] = 10000;
	
	f[0][0] = 0;
	
	for (int s = 1; s <= 1 << n - 1; s++) {
		for (int i = 1; i <= n; i++) {
			printf("%d",s & 1 << (i - 1));
			if (!(s & 1 << (i - 1))) continue;
			for (int j = 0; j <= n; j++) {
				if (i == j) continue;
				if (j && !(s & 1 << (j - 1)))continue;
				f[i][s] = min(f[i][s], f[j][s - 1 << (i - 1)] + dis[j][i]);
			}
		}
	}
	
	for (int i = 1; i <= n; i++) ans = min(ans, f[i][1 << n - 1]);
	cout << fixed << setprecision(2) << ans;
	
	return 0;
}
2021/1/17 14:41
加载中...