RT,求帮忙看看,大致思路注释了,样例没过
#include<bits/stdc++.h>
using namespace std;
#define db double
const int INF = 0x3f3f3f3f;
int n;
db dp[1<<20][20],x[20],y[20];
db dis(int a,int b) {return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));}
void checkmin(db &x,db y)
{
if(x==-1||x>y)
x=y;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lf%lf",&x[i],&y[i]);
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=n;i++)
dp[1<<(i-1)][i]=dis(0,i);
dp[0][0]=dp[1][0]=0;
for(int mask=1;mask<(1<<n) ;mask++)//当前状态
for(int end=1;end<=n;end++)//上一次从哪个点转移来
if(dp[mask][end]!=INF)
{
// if(mask&(1<<(end-1))==0) continue;
for(int nxt=1;nxt<=n;nxt++)//下一个状态是什么
{
if(end==nxt) continue;
if(! (mask&(1<<(nxt-1))) )
{
checkmin(dp[mask|(1<<(nxt-1))][nxt],dp[mask][end]+dis(end,nxt));
}
}
}
db ans=-1;
for(int end=1;end<=n;end++)
{
// printf("%lf ",dp[(1<<n)-1][end]);
if(dp[(1<<n)-1][end]!=INF)
checkmin(ans,dp[(1<<n)-1][end]+dis(end,0));
}
printf("%.2lf",ans);
return 0;
}