题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1143

题意:逆时针给一个凸包的n(n<=200)个顶点坐标,求一个最短哈密顿路径的长度。

解法:求最短哈密顿本身是一个NP问题,可是由于是凸包上,能够利用这个做;有一个性质:凸包上的最短哈密顿路径不会出现交叉。所以能够看出来从一点出发,他要么和顺时针相邻点连接,要么和逆时针相邻点相连接。通过这个性质能够通过dp做:

ans[i][j][0]表示i開始。往后j的点最短路径长度,ans[i][j][0]表示i開始,往前j的点最短路径长度。

转移方程见代码:有了转移方程枚举第一个起始位置即可,复杂度n^3.

/******************************************************
* @author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
//freopen ("in.txt" , "r" , stdin);
using namespace std; #define eps 1e-8
#define zero(_) (abs(_)<=eps)
const double pi=acos(-1.0);
typedef long long LL;
const int Max=210;
const int INF=1e9+7; struct point
{
double x,y;
void read()
{
scanf("%lf%lf",&x,&y);
}
} points[Max];
double dist[Max][Max];
int t=0;
int n;
double getdis(int i,int j)
{
return dist[(i+t)%n][(j+t)%n];
}
double getdist(int i,int j)
{
i=(i+n)%n;
j=(j+n)%n;
return sqrt((points[i].x-points[j].x)*(points[i].x-points[j].x)+
(points[i].y-points[j].y)*(points[i].y-points[j].y));
}
double ans[Max][Max][2];
double dfs(int i,int j,int st)
{
i=(i+n)%n;
if(!zero(ans[i][j][st]))
return ans[i][j][st];
if(j==1)
return ans[i][j][st]=getdis(i,i+(st?-1:1));
if(!st)
return ans[i][j][st]=min(dfs(i+1,j-1,0)+getdis(i,i+1),dfs(i+j,j-1,1)+getdis(i,i+j));
else
return ans[i][j][st]=min(dfs(i-1,j-1,1)+getdis(i,i-1),dfs(i-j,j-1,0)+getdis(i,i-j));
}
double solve()
{
memset(ans,0,sizeof ans);
return min(dfs(1,n-2,0)+getdis(0,1),dfs(n-1,n-2,1)+getdis(0,n-1));
}
int main()
{
scanf("%d",&n);
for(int i=0; i<n; i++)
points[i].read();
for(int i=0; i<n; i++)
for(int j=i; j<n; j++)
{
dist[i][j]=getdist(i,j);
dist[j][i]=dist[i][j];
}
double out=INF;
out=min(out,solve());
for(int i=0; i<n-1; i++)
{
t++;
point p=points[0];
for(int j=0; j<n-1; j++)
points[j]=points[j+1];
points[n-1]=p;
out=min(out,solve());
}
printf("%.3f\n",out);
return 0;
}

ural 1143. Electric Path(凸包上最短哈密顿路径)的更多相关文章

  1. ural 1143. Electric Path

    1143. Electric Path Time limit: 1.0 secondMemory limit: 64 MB Background At the team competition of ...

  2. 【CH0103】最短哈密顿路径

    题目大意:给定一个 N 个点的无向图,点有点权,求从 0 号点走到 N-1 号点的最短哈密顿路径是多少. 题解:由于哈密顿路径的定义是每个顶点必须经过且仅能经过一次,因此,可用当前是否经过了这些点和当 ...

  3. 世界上最短的bash脚本

    世界上最短的bash脚本长这样: #!/bin/bash 为啥呢?见下图: 推荐一篇文章,讲解为啥shell脚本开头总是"#!/bin/bash".文风太清奇,不好翻译,看原文吧: ...

  4. 一个被称为世界上最短的判断IE方法

    最近偶然看到一段判断是否为IE浏览器的代码: if(!+[1,]) { console.info("IE 浏览器"); } else { console.info("非 ...

  5. [Javascript]史上最短的IE浏览器判断代码

    今天发现个很有趣的js判断全世界最短的代码,想想之前自己写的判断ie浏览器的,这个实在简单多了 var ie = !+"\v1"; 仅仅需要7bytes!参见这篇文章,<32 ...

  6. POJ 2187 求凸包上最长距离

    简单的旋转卡壳题目 以每一条边作为基础,找到那个最远的对踵点,计算所有对踵点的点对距离 这里求的是距离的平方,所有过程都是int即可 #include <iostream> #includ ...

  7. UVALive 2453 Wall (凸包)

    题意:给你一个多边形的城堡(多个点),使用最短周长的城墙将这个城堡围起来并保证城墙的每个点到城堡上的每个点的距离都不小于l 题解:因为两点间的直线一定比折线短,所以这样做 先使用所有点求得一个凸包,接 ...

  8. 【BZOJ-1670】Building the Moat护城河的挖掘 Graham扫描法 + 凸包

    1670: [Usaco2006 Oct]Building the Moat护城河的挖掘 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 464  Solv ...

  9. HDU 4946 Area of Mushroom (几何凸包)

    题目链接 题意:给定n个人,每个人有一个速度v方向任意.如果平面中存在一个点只有某个人到达的时间最短(即没有人比这个人到的时间更短或相同),那么我们定义这个店归这个人管辖,现在问这些人中哪些人的管辖范 ...

随机推荐

  1. Linux学习总结(17)——Linux新手必须学会的12个命令

    今天的用户可以根据自己的意愿选择是否使用作为Linux象征的命令行,确切的证明了Linux已经有了很大的发展.现在很多Linux发行版的图形用户界面已经非常强大,不再需要命令行. 但是命令行在Linu ...

  2. hdoj 1013Digital Roots

     /*Digital Roots Problem Description The digital root of a positive integer is found by summing th ...

  3. jqMobi(App Framework)入门学习(一)

    jqMobi(App Framework)入门学习(一) 1. 什么是jqMobi? jqMobi是由appMobi针对HTML5浏览器和移动设备开发的javascript框架.是个极其高速的查询选择 ...

  4. TSNE——目前最好的降维方法

    转自:http://blog.csdn.net/u012162613/article/details/45920827 1.流形学习的概念 流形学习方法(Manifold Learning),简称流形 ...

  5. shiro动态控制url资源

    怎么利用shiro权限动态控制每个url资源呢?主要包括jsp(html)页面.action的url访问,而静态资源和登录资源则可直接访问. 所谓动态控制url就是url的权限控制不是手动写死在配置文 ...

  6. POJ 2431 Expedition (priority_queue或者multiset可解)

    Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18655   Accepted: 5405 Descr ...

  7. sqluldr2linux64.bin的使用

    使用sqluldr2linux64.bin的前提是已经安装了Oracle数据库,sqluldr2linux64.bin和Oracle在同一台主机上使用,使用之前需要赋予可执行权限: [root@nod ...

  8. MySQL用户添加和分配权限

    mysql数据库insertdelete服务器file mysql> grant 权限1,权限2,…权限n on 数据库名称.表名称 to 用户名@用户地址 identified by ‘连接口 ...

  9. Windows上快速编译caffe CPU版本

    windows上快速安装配置Caffe的 cpu_only环境. 一:安装环境: 1.windows10: 2.Visual Studio2013: 3.Caffe版本:http://github.c ...

  10. Activiti 23张表及7大服务详解

    7大服务介绍 服务名称 描述 RepositoryService Activiti 中每一个不同版本的业务流程的定义都需要使用一些定义文件,部署文件和支持数据 ( 例如 BPMN2.0 XML 文件, ...