| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 3470 | Accepted: 1545 |
Description
Input
Output
Sample Input
3
1 1
2 3
3 1
4
1 1
2 3
3 1
4 2
Sample Output
6.47
7.89
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
#define INF 0x3f3f3f3f
const int maxn=10001;
using namespace std;
double dp[maxn][maxn],dis[maxn][maxn];
int n;
struct Point{
int x;
int y;
}p[maxn];
bool cmp(Point a,Point b)
{
return a.x<b.x;
}
double cal(Point a,Point b)
{
return sqrt((double)(a.x-b.x)*(a.x-b.x)+(double)(a.y-b.y)*(a.y-b.y));
}
double bitonicTSP()
{
int i,j;
dp[0][0]=0;
dp[1][0]=dis[0][1]; //initial dis[0][1]不是dis[1][0]
for(i=1;i<n-1;i++)
{
dp[i+1][i]=INF;
for(j=0;j<i;j++)
{
dp[i+1][j]=dp[i][j]+dis[i][i+1];
dp[i+1][i]=min(dp[i+1][i],dp[i][j]+dis[j][i+1]);
}
}
return dp[n-1][n-2]+dis[n-2][n-1];
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
scanf("%d%d",&p[0].x,&p[0].y);
if(n==1) {printf("0.00\n");continue;}
for(int i=1;i<n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
}
sort(p,p+n,cmp);
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
{
dis[i][j]=cal(p[i],p[j]); //注意这里,我的代码,要求dis[i][j],i<j,
}
printf("%.2lf\n",bitonicTSP());
}
return 0;
}
(表示确实很难理解!
)
具体思想,欢迎大家看:http://blog.csdn.net/code_or_code/article/details/26283159
POJ 2677(双调旅行商问题<bictonicTSP>,布布扣,bubuko.com
原文:http://blog.csdn.net/code_or_code/article/details/26387829