基本的状压dp 需要注意的是两点之间直线最短 所以不需要进行floyd
由于把dp的memset放在了初始化0的后面de了好久的bug..
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<map> using namespace std; #define eqs 0.000000001 struct node { double x; double y; }; node a[20]; double f[20][20]; double dp[1<<17][20]; int main(){ int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); memset(f,0,sizeof(f)); for(int i=0;i<n;i++) { scanf("%lf%lf",&a[i].x,&a[i].y); } for(int i=0;i<n;i++) { for(int k=0;k<n;k++) { f[i][k]=f[k][i]=sqrt((a[i].x-a[k].x)*(a[i].x-a[k].x)+(a[i].y-a[k].y)*(a[i].y-a[k].y)); } } int l=(1<<n)-1; memset(dp,0x7f,sizeof(dp)); for(int i=0;i<n;i++) { dp[1<<i][i]=0; } for(int s=0;s<=l;s++) { for(int i=0;i<n;i++) { if((s&(1<<i))==0) continue; for(int k=0;k<n;k++) { if((s&(1<<k))!=0) continue; dp[s+(1<<k)][k]=min(dp[s+(1<<k)][k],dp[s][i]+f[i][k]); } } } double ans=1e300; for(int i=0;i<n;i++) { ans=min(dp[l][i],ans); } printf("%.2f ",ans); } }