#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;
}
代码如上,求大佬指点