1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include <bits/stdc++.h> using namespace std; typedef long long ll; #define sf(n) scanf("%d",&n) #define pf(n) printf("%d",n) #define pfc(c) printf(c) #define fi(i,s,t) for(int i=s;i<t;i++) #define fd(s,t) for(int i=s-1;i>=t;i--) #define mem(a,c) memset(a,c,sizeof(a)) const double INF=0x3f3f3f3f; const int MAX=17; const int N=1<<15; int n; double dis[MAX][MAX],ans,dp[N][MAX],x[MAX],y[MAX]; int main(){ freopen("in","r",stdin); sf(n); x[0]=0;y[0]=0; fi(i,1,n+1){ scanf("%lf",&x[i]);scanf("%lf",&y[i]); } fi(i,0,n+1) fi(j,i+1,n+1){ dis[i][j] = sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); dis[j][i] = dis[i][j]; } fi(s,0,1<<n){ fi(i,1,n+1){ if(s&(1<<(i-1))){ if(s==(1<<(i-1))) dp[s][i] = dis[0][i]; else { dp[s][i]=INF; fi(j,1,n+1){ if(s&(1<<(j-1)) && j!=i){ dp[s][i]=min(dp[s^(1<<(i-1))][j]+dis[j][i],dp[s][i]); } } } } } } ans =dp[(1<<n)-1][1]; fi(i,2,n+1) if(dp[(1<<n)-1][i] < ans) ans = dp[(1<<n)-1][i]; printf("%.2lf",ans); return 0; }
|