旅行商问题简化版

求解,为什么我的代码有时候全对,有时候全错
#include<iostream>
#include<math.h>
#include<stdio.h>
//#include<fstream>
using namespace std;
//ifstream fin("cin.in");

int n;
double f[1001][1001];
double d[1001][1001];
double x[1001],y[1001];

void Qsort(int left,int right){
if(left>=right) return ;
int i=left,j=right;double mid=x[(left+right)>>1];
while(i<=j)
{
while(x[i]<mid) i++;
while(x[j]>mid) j--;
if(i<=j)
{
swap(x[i],x[j]);
swap(y[i],y[j]);
i++;j--;
}
}
Qsort(left,j);
Qsort(i,right);
}

int main()
{
cin>>n;
for(int i=1;i<=n;++i)
cin>>x[i]>>y[i];

Qsort(1,n);

for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j)
d[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));

for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
f[i][j]=1e24;

f[2][1]=d[1][2];
for(int i=3;i<=n;++i)
for(int j=1;j<i;++j)
if(j+1<i) f[i][j]=f[i-1][j]+d[i-1][i];
else
{
for(int k=1;k<j;++k)
f[i][j]=min(f[i][j],f[j][k]+d[k][i]);

}

printf("%.2lf\n",f[n][n-1]+d[n-1][n]);
return 0;

}

1 条评论

  • 1

信息

ID
1014
难度
6
分类
动态规划 点击显示
标签
(无)
递交数
2908
已通过
881
通过率
30%
被复制
17
上传者