一个简单的dfs
使用最优性
90AC
其余TLE
#include<bits/stdc++.h>
using namespace std;
struct nod{
double x,y;
}a[20];
int n;
int vis[20]={0};
double dsc[20][20];//记录距离
double d(double x1,double y1,double x2,double y2){
return sqrt(pow(x1-x2,2)+pow(y1-y2,2));
}
double ans=1e5;
void dfs(int num,int dep,double nowans){
if(dep==n){
ans=min(nowans,ans);
return;
}
for(int i=1;i<=n;i++){
if(nowans+dsc[num][i]<ans&&vis[i]==0){//最优性剪枝
vis[i]=1;
dfs(i,dep+1,nowans+dsc[num][i]);
vis[i]=0;
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
dsc[0][i]=d(0,0,a[i].x,a[i].y);
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(i!=j){
dsc[i][j]=dsc[j][i]=d(a[i].x,a[i].y,a[j].x,a[j].y);
}
}
}
for(int i=1;i<=n;i++){//列举第一块的可能
memset(vis,0,sizeof(vis));
vis[i]=1;
dfs(i,1,dsc[0][i]);
}
printf("%.2f",ans);
return 0;
}