#include<iostream> #include<iomanip> #include<cmath> using namespace std; const int N=20; int n; double spot[N][2],dis[N][N],state[1<<N][N],ans=1e9; bool vis[N]; void dfs(int cur_p,int cur_s,double res){ if(res>=ans)return; if(cur_s==(1<<n)-1){ ans=res;return; } for(int i=1;i<=n;i++) if(!vis[i]){ int try_s=cur_s+(1<<i-1); if(state[try_s][i]!=0&&state[try_s][i]<=res+dis[cur_p][i])continue; vis[i]=true; state[try_s][i]=res+dis[cur_p][i]; dfs(i,try_s,state[try_s][i]); vis[i]=false; } } int main(){ cin>>n; spot[0][0]=spot[0][1]=0; for(int i=1;i<=n;i++)cin>>spot[i][0]>>spot[i][1]; for(int i=0;i<n;i++) for(int j=i+1;j<=n;j++){ double t=(spot[i][0]-spot[j][0])*(spot[i][0]-spot[j][0]) +(spot[i][1]-spot[j][1])*(spot[i][1]-spot[j][1]); dis[i][j]=sqrt(t); dis[j][i]=dis[i][j]; } dfs(0,0,0); cout<<fixed<<setprecision(2)<<ans<<endl; return 0; }
P1433吃奶酪记忆化搜索
猜你喜欢
转载自www.cnblogs.com/lyt888/p/12684040.html
今日推荐
周排行