poj2677 双调欧几里德旅行商问题

 1 int n,m,i,k,j,p;
 2 main()
 3 {
 4     while(~scanf("%d",&n))
 5     {
 6         double x[n+1],y[n+1],d[n+1][n+1],w[n+1][n+1];
 7         for(i=1;i<=n;i++)scanf("%lf%lf",&x[i],&y[i]);
 8         for(i=1;i<=n;i++)for(j=1;j<=n;j++)
 9         w[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
10         d[2][1]=d[1][2]=w[2][1];
11         for(i=3;i<=n;i++)
12         for(j=1;j<i;j++)
13         {
14             if(i>j+1)d[i][j]=d[i-1][j]+w[i][i-1];
15             if(i==j+1)
16             {
17                 d[i][j]=d[j][1]+w[i][1];
18                 for(k=1;k<=i-2;k++)d[i][j]=d[i][j]<d[j][k]+w[i][k]?d[i][j]:d[j][k]+w[i][k];
19             }
20         }
21         d[n][n]=d[n][1]+w[n][1];
22         for(k=1;k<=n-1;k++)d[n][n]=d[n][n]<d[n][k]+w[n][k]?d[n][n]:d[n][k]+w[n][k];
23         printf("%.2lf\n",d[n][n]);
24     }
25 }

 

posted on 2013-06-29 19:51  dokc  阅读(187)  评论(0编辑  收藏  举报

导航