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 }