80pts求助
查看原帖
80pts求助
742881
YangJZHelloGS JN楼主2023/11/6 17:12
#include <iostream>
#include <cmath>
#include <utility>

const int MAXN=1100;
const long long INF=0x3f3f3f3f3f3f3f3f;

double M[MAXN][MAXN];
int n, so[MAXN], k;
std::pair<double, double> pos[MAXN];

double d(std::pair<double, double> p1, std::pair<double, double> p2) {
	return std::sqrt((p1.first-p2.first)*(p1.first-p2.first) + (p1.second-p2.second)*(p1.second-p2.second));
}

void init_dis() {
	for(int i=1; i<=n; ++i)
		for(int j=1; j<=n; ++j)
			M[i][j] = d(pos[i], pos[j]), M[j][i] = M[i][j];
	return;
}

double insert(int pre, int num) {
	return M[pre][num] + M[num][so[pre]] - M[pre][so[pre]];
}

int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cin >> n;
	for(int i=1; i<=n; ++i) std::cin >> pos[i].first >> pos[i].second;
	init_dis();
	for(int i=1; i<=n; ++i) if(pos[i].second > pos[k].second) k = i;
	so[0] = k;
	for(int i=1; i<=n; ++i) {
		double min_add=INF;
		int min_pre=k;
		int now=k;
		if(i==k) {
			continue;
		}
		while(so[now]>0) {
			if(insert(now, i)<min_add) {
				min_add = insert(now, i);
				min_pre = now;
			}
			now = so[now];
		}
		if(min_add<M[so[0]][i]) {
			so[i] = so[min_pre];
			so[min_pre] = i;
		}
		else {
			so[so[0]] = i;
			so[0] = i;
		}
	}
	int now=k;
	while(now>0) {
		std::cout << now << ' ';
		now = so[now];
	}
	return 0;
}

代码如上,求大佬指点

2023/11/6 17:12
加载中...