直接贪心,每次找距离当前点最近的点,期望能拿多少分?
#include<bits/stdc++.h>
#define N 1010
using namespace std;
const double INF=999999999;
int n,vis[N],k,_max=-114514;
double x[N],y[N],s[N][N];
double check(double a,double b,double c, double d){
double ans;
ans=sqrt((a-c)*(a-c)+(b-d)*(b-d));
return ans;
}
void dfs(int p){
cout << p << " ";
vis[p]=1;
double _min=INF;
int h=-1;
for(int i=1;i<=n;i++){
if(s[p][i]<_min&&vis[i]==0){
_min = s[p][i];
h = i;
}
}
if(h!=-1) dfs(h);
}
int main(){
//freopen("tree.in","r",stdin);
//freopen("tree.out","w",stdout);
cin >> n;
for(int i=1;i<=n;i++){
cin >> x[i] >> y[i];
if(y[i]>_max){
_max=y[i];
k=i;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j){
s[i][j]=INF;
s[j][i]=INF;
}
else{
s[i][j] = check(x[i],y[i],x[j],y[j]);
s[j][i] = s[i][j];
}
}
}
vis[k]=1;
dfs(k);
return 0;
}