不会状压,DFS最后一个数据T了…… DP代码……
#include <bits/stdc++.h>
using namespace std;
int i,j,k,n,que[20],tot,p;
double x[20],y[20],ans,len[20][20],f[20][100000];
double jl(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
memset(f,127,sizeof(f));
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x[i]>>y[i];
f[i][(1<<(i-1))]=jl(0,0,x[i],y[i]);
}
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
len[i][j]=len[j][i]=jl(x[i],y[i],x[j],y[j]);
for(int s=1;s<(1<<n);s++)
{
for(int k=0;k<n;k++)
if(((1<<k)&s)==0)
que[tot++]=k;
for(int i=1;i<=n;i++)
{
if(abs(f[i][s]-f[0][0])<0.0000001)
continue;
for(int l=1;l<=tot;l++)
f[que[l]+1][s|1<<(que[l])]=min(f[que[l]+1][s|1<<(que[l])],f[i][s]+len[que[l]+1][i]);
}
}
ans=f[0][0];
for(int i=1;i<=n;i++)
ans=min(ans,f[i][(1<<n)-1]);
printf("%.2lf",ans);
return 0;
}
T了的DFS……
#include<bits/stdc++.h>
using namespace std;
int n,b[20];
double ans;
struct DM{
double x,y;
}a[20];
double dis(int i,int j)
{
return sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));
}
void dfs(int tot,double s,int l)
{
if(s>ans)
return;
else
{
if(tot==n)
{
ans=min(ans,s);
return;
}
else
for(int i=1;i<=n;i++)
{
if(!b[i])
{
b[i]=1;
dfs(tot+1,s+dis(l,i),i);
b[i]=0;
}
}
return;
}
return;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i].x>>a[i].y;
a[0].x=a[0].y=0;
ans=double(127);
dfs(0,0,0);
printf("%.2lf",ans);
}
………………
大佬救命…………