POJ2677 Tour(DP+双调欧几里得旅行商问题)
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 3929 | Accepted: 1761 |
Description
Write a program that, given a set of n points in the
plane, computes the shortest closed tour that connects the points according to
John's strategy.
Input
in the file stands for a particular set of points. For each set of points the
data set contains the number of points, and the point coordinates in ascending
order of the x coordinate. White spaces can occur freely in input. The input
data are correct.
Output
result to the standard output from the beginning of a line. The tour length, a
floating-point number with two fractional digits, represents the result. An
input/output sample is in the table below. Here there are two data sets. The
first one contains 3 points specified by their x and y coordinates. The second
point, for example, has the x coordinate 2, and the y coordinate 3. The result
for each data set is the tour length, (6.47 for the first data set in the given
example).
Sample Input
3
1 1
2 3
3 1
4
1 1
2 3
3 1
4 2
Sample Output
6.47
7.89 参考博客:http://www.cnblogs.com/-sunshine/archive/2012/07/23/2605251.html
J.L. Bentley 建议通过只考虑双调旅程(bitonic tour)来简化问题,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到左直至出发点。下图(b)显示了同样的7个点的最短双调路线。在这种情况下,多项式的算法是可能的。事实上,存在确定的最优双调路线的O(n*n)时间的算法。
图a
图b
注:在一个单位栅格上显示的平面上的七个点。 a)最短闭合路线,长度大约是24.89。这个路线不是双调的。b)相同点的集合上的最短双调闭合路线。长度大约是25.58。
这是一个算导上的思考题15-1。
首先将给出的点排序,关键字x,重新编号,从左至右1,2,3,…,n。
定义p[i][j],表示结点i到结点j之间的距离。
定义d[i][j],表示从i连到1,再从1连到j,(注意,i>j,且并没有相连。)

对于任意一个点i来说,有两种连接方法,一种是如图(a)所示,i与i-1相连,另一种呢是如图(b),i与i-1不相连。
根据双调旅程,我们知道结点n一定与n相连,那么,如果我们求的d[n][n-1],只需将其加上p[n-1][n]就是最短双调闭合路线。
根据上图,很容易写出方程式:
dp[i][j]=dp[i-1][j]+dist[i][i-1]; i这一点是i+1走到的
dp[i][i-1]=min(dp[i][i-1],dp[i-1][j]+dist[j][i]); i这一点是从j走到的,找到j的最小值
自己的理解:刘汝佳书上的思路看懂了,但是老卡,抽空在想想他的思路,这个思路也好理解,在dp[i][j]这个位置,到下一个i+1,有两种情况要么是i走到的,要么是j走到的,如果是i走到的就对应第一个转移方程,如果是j走到的 dp[i][j] == dp[j][i],所以对应第二个方程
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAX = + ;
struct points
{
double x,y;
};
points point[MAX];
double d[MAX][MAX];
int cmp(points a, points b)
{
return (b.x - a.x > 0.00001);
}
double Min(double a, double b)
{
if(a - b > 0.00001)
return b;
else
return a;
}
double dist(int a, int b)
{
return sqrt( (point[a].x - point[b].x) * (point[a].x - point[b].x) + (point[a].y - point[b].y) * (point[a].y - point[b].y));
}
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
for(int i = ; i <= n; i++)
scanf("%lf%lf", &point[i].x, &point[i].y);
sort(point + , point + n + , cmp);
if(n == )
{
printf("0\n");
continue;
}
d[][] = ;
for(int i = ; i <= n; i++)
d[i][] = dist(i, ); for(int i = ; i < n; i++)
{
d[i + ][i] = 10000000.0;
for(int j = ; j < i; j++)
{
d[i + ][j] = d[i][j] + dist(i, i + );
d[i + ][i] = Min(d[i + ][i], d[i][j] + dist(j,i + ));
}
}
printf("%.2lf\n", d[n][n - ] + dist(n - , n));
}
return ;
}
POJ2677 Tour(DP+双调欧几里得旅行商问题)的更多相关文章
- 2014百度之星第二题Disk Schedule(双调欧几里得旅行商问题+DP)
Disk Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- 2014年百度之星程序设计大赛 - 资格赛 1002 Disk Schedule(双调欧几里得旅行商问题)
Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取.然而,在现实中,这样的做法非常复杂.我们考虑一个相对简单的场景.磁盘有 ...
- 双调欧几里得旅行商问题(TSPhdu2224)
http://acm.hdu.edu.cn/showproblem.php?pid=2224 The shortest path Time Limit: 1000/1000 MS (Java/Othe ...
- hdu 2224 双调欧几里得旅行商问题tsp
/* 题意:平面上n个点,确定一条连接各点的最短闭合旅程且每个点仅用一次.这个解的一般形式为NP的(在多项式时间内可以求出) 建议通过只考虑双调旅程(bitonictour)来简化问题,这种旅程即为从 ...
- 欧几里得旅行商问题 java与c++实现
双调欧几里得旅行商问题是一个经典动态规划问题.<算法导论(第二版)>思考题15-1 旅行商问题描述:平面上n个点,确定一条连接各点的最短闭合旅程.这个解的一般形式为NP的(在多项式时间内可 ...
- 【HDU2224】The shortest path(双调欧几里得dp)
算法导论上一道dp,挺有趣的.于是就研究了一阵. dp(i, j)代表从左边第一个点到第i个点与从从左边最后一个点(即为第一个点)到j点的最优距离和.于是找到了子状态. 决策过程 dp[i][j] = ...
- POJ2677 Tour[DP 状态规定]
Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4307 Accepted: 1894 Description ...
- poj2677 Tour
题意: 双调欧几里得旅行商问题. 思路: dp.定义dp[i][j](i <= j)为从点j从右向左严格按照x坐标递减顺序走到点1,之后再从点1从左向右严格按照x坐标递增的顺序走到点i,并且在此 ...
- code1213 解的个数 扩展欧几里得
很不错的题,加深了我对exgcd的理解 (以前我认为做题就是搜索.dp...原来数学也很重要) 理解了几个小时,终于明白了.但我什么都不打算写. 看代码吧: #include<iostream& ...
随机推荐
- C语言 百炼成钢12
//题目34:对10个数进行排序 #include<stdio.h> #include<stdlib.h> //分析:使用冒泡排序 void main(){ ] = { , , ...
- MSMQ消息队列安装
一.Windows 7安装.管理消息队列1.安装消息队列 执行用户必须要有本地 Administrators 组中的成员身份,或等效身份. 具体步骤: 开始—>控制面板—>程 ...
- NPOI 导出excel带图片,可控大小
using NPOI.HSSF.UserModel;using NPOI.HSSF.Util;using NPOI.DDF;using NPOI.SS.UserModel;using System.I ...
- Java 征途:行者的地图 (转)
http://www.cnblogs.com/mindwind/p/5251430.html Java 征途:行者的地图 前段时间应因缘梳理了下自己的 Java 知识体系, 成文一篇望能帮到即将走 ...
- 从0开始学Java——JSP&Servlet——HttpServletRequest相关的几个路径信息
在HttpServletRequest中有几个获取路径的接口:getRequestURI/getContextPath/getServletPath/getPathInfo 这些接口互相之间有什么区别 ...
- [CareerCup] 8.2 Call Center 电话中心
8.2 Imagine you have a call center with three levels of employees: respondent, manager, and director ...
- LeetCode-Group Shifted Strings
Given a string, we can "shift" each of its letter to its successive letter, for example: & ...
- 【iOS功能实现】之利用UIDocumentInteractionController打开和预览文档
iOS提供了使用其他app预览文件的支持,这就是Document Interaction Controller.此外,iOS也支持文件关联,允许其他程序调用你的app打开某种文件.而且,从4.2开始, ...
- StretchDIBits函数
该函数将DIB中矩形区域内像素使用的颜色数据拷贝到指定的目标矩形中.如果目标矩形比源矩形大小要大,那么函数对颜色数据的行和列进行拉伸,以与目标矩形匹配.如果目标矩形大小要比源矩形小,那么该函数通过使用 ...
- MVC5 + EF6 + Bootstrap3 (7) Bootstrap的栅格系统
文章来源: Slark.NET-博客园http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-grid.html 上一节:ASP.NET MVC ...