代码改变世界

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 }