Sicily/1163. Tour
2011-07-28 14:54 Min·zc 阅读(353) 评论(0) 编辑 收藏 举报双调旅行商问题,google一下有很多讲解
这个是写的比较明白的http://www.cppblog.com/doer-xee/archive/2009/11/30/102296.html
1 #include <iostream>
2 #include <cstdio>
3 #include <stdlib.h>
4 #include <memory.h>
5 #include <math.h>
6 using namespace std;
7 float ans[100][100];
8 struct PT
9 {
10 int x;
11 int y;
12 };
13 PT p[100];
14 int cmp(const void* a, const void* b)
15 {
16 return ((PT*)a)->x-((PT*)b)->x;
17 }
18 float cal(int i,int j)
19 {
20 float tem=sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));
21 return tem;
22 }
23 void sol(int n)
24 {
25 ans[0][1]=cal(0,1);
26 for(int j=2;j<n;j++)
27 {
28 for(int i=0;i<j;i++)
29 {
30 if(i!=j-1)
31 ans[i][j]=ans[i][j-1]+cal(j-1,j);
32 else
33 {
34 float tem=999999;
35 for(int k=0;k<i;k++)
36 {
37 if(ans[k][j-1]+cal(k,j)<tem)
38 tem=ans[k][j-1]+cal(k,j);
39 }
40 ans[i][j]=tem;
41 }
42 }
43 }
44 float a=ans[n-2][n-1]+cal(n-2,n-1);
45 printf("%.2f\n",a);
46 }
47 int main()
48 {
49 int n;
50 while(cin>>n)
51 {
52 memset(p,0,sizeof(p));
53 memset(ans,0,sizeof(ans));
54 for(int i=0;i<n;i++)
55 {
56 cin>>p[i].x;
57 cin>>p[i].y;
58 }
59 //qsort(p,n,sizeof(p[0]),cmp);
60 sol(n);
61 }
62 }