https://www.luogu.org/problem/show?pid=1433
题意:起点为(0,0) 有n个点 求出起点出发经过n个点的最小距离
//15个点 暴力 + 最优性cut(sum+还剩的点*最小距离>=ans 则stop) 水过...
#include <bits/stdc++.h> using namespace std; typedef pair<int,double> pii; const int N=2e3+20; const double inf=1e7; struct node{ double x,y; }a[N]; int n; double d(int i,int j) { double dx=a[i].x-a[j].x; double dy=a[i].y-a[j].y; return sqrt(dx*dx+dy*dy); } double ans,mn; double dist[N][N]; int vis[N]; void dfs(int cur,double sum,int cnt) { if(sum+(n-cnt)*mn>=ans)//最优性cut return; if(cnt==n) { ans=min(ans,sum); return; } for(int i=1;i<=n;i++) { if(!vis[i]) { vis[i]=1; dfs(i,sum+dist[i][cur],cnt+1); vis[i]=0; } } } int main() { while(cin>>n) { memset(vis,0,sizeof(vis)); mn=ans=1e7; for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y; a[0].x=a[0].y=0; for(int i=0;i<=n;i++) { for(int j=0;j<=n;j++) { if(i==j) continue; dist[i][j]=d(i,j); mn=min(mn,dist[i][j]); } } dfs(0,0,0); printf("%.2lf\n",ans); } return 0; }
时间: 2024-10-11 12:55:22