<更新提示>

<第一次更新>


<正文>

The Captain(BZOJ 4152)

Description

给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用。

Input Format

第一行包含一个正整数n(2<=n<=200000),表示点数。

接下来n行,每行包含两个整数xi,yi(0<=xi,yi<=10^9),依次表示每个点的坐标。

Output Format

一个整数,即最小费用。

Sample Input

5
2 2
1 1
4 5
7 1
6 7

Sample Output

2

解析

假如说我们直接将平面中的每一个点视为图中的每一个点的话,这就是一道最短路问题。但是显而易见的是我们需要连\(n^2\)条边,这是一定会超时的,主要考虑如何建图优化。

手推几个样例可以发现图中有很多无用的边存在,我们考虑证明什么情况下的连边是不必要的。

证明:

对于任意两点\(P,Q\),其距离为\(\min\{\Delta x,\Delta y\}\).

  • 距离取\(\Delta x\):

    假如在横坐标意义上\(P,Q\)有中间点\(M\).
  1. \(PM\)取\(\Delta x_{pm}\),\(MQ\)取\(\Delta x_{mq}\),则\(PQ\)连边和\(PM\),\(MQ\)等价.
  2. \(PM\)取\(\Delta x_{pm}\),\(MQ\)取\(\Delta y_{mq}\),由于\(\Delta y_{mq}<\Delta x_{mq}\),\(PQ\)连边大于\(PM\),\(MQ\).
  3. \(PM\)取\(\Delta y_{pm}\),\(MQ\)取\(\Delta x_{mq}\),由于\(\Delta y_{pm}<\Delta x_{pm}\),\(PQ\)连边大于\(PM\),\(MQ\).
  4. \(PM\)取\(\Delta y_{pm}\),\(MQ\)取\(\Delta y_{mq}\),由于\(\Delta y_{pm}<\Delta x_{pm}\),\(\Delta y_{mq}<\Delta x_{mq}\),\(PQ\)连边大于\(PM\),\(MQ\).

    所以,当\(P,Q\)距离取\(\Delta x\),且横坐标意义上\(P,Q\)有中间点\(M\)时,\(PQ\)连边一定不能对最优解造成贡献。
  • 距离取\(\Delta y\):

    假如在纵坐标意义上\(P,Q\)有中间点\(M\),同理\(PQ\)连边一定不能对最优解造成贡献。

得出结论:当\(P,Q\)距离取\(\Delta x\),且横坐标意义上\(P,Q\)有中间点\(M\),或者距离取\(\Delta y\),纵坐标意义上\(P,Q\)有中间点\(M\)时,\(PQ\)连边一定不能对最优解造成贡献

那么这就是不必要连的边。相反,则任意两点\(U,V\)距离取\(\Delta x\),且横坐标意义上\(U,V\)相邻,或者\(U,V\)距离取\(\Delta y\),且纵坐标意义上\(U,V\)相邻时,\(U,V\)连边是必要的

那么我们把必要的边连起来就行了,这样的边至多有\(2n\)条,堆优化\(Dijkstra\)解决最短路问题。

\(Code:\)



#include<bits/stdc++.h>
using namespace std;
const int N=200000+80;
struct node{int num,x,y;}p[N];
struct edge{int ver,val,next;}e[N*4];
int n,t,Last[N*4],dis[N],vis[N];
inline bool cmp1(node p1,node p2){return p1.x<p2.x;}
inline bool cmp2(node p1,node p2){return p1.y<p2.y;}
inline bool check1(node p1,node p2){return p2.x-p1.x<=abs(p1.y-p2.y);}
inline bool check2(node p1,node p2){return p2.y-p1.y<abs(p1.x-p2.x);}
inline void insert(int x,int y,int v)
{
e[++t].val=v;e[t].ver=y;
e[t].next=Last[x];Last[x]=t;
}
inline void input(void)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
p[i].num=i;
}
}
inline void init(void)
{
sort(p+1,p+n+1,cmp1);
for(int i=1;i<n;i++)
{
if(check1(p[i],p[i+1]))
insert(p[i].num,p[i+1].num,p[i+1].x-p[i].x),insert(p[i+1].num,p[i].num,p[i+1].x-p[i].x);;
}
sort(p+1,p+n+1,cmp2);
for(int i=1;i<n;i++)
{
if(check2(p[i],p[i+1]))
insert(p[i].num,p[i+1].num,p[i+1].y-p[i].y),insert(p[i+1].num,p[i].num,p[i+1].y-p[i].y);
}
}
inline void dijkstra(void)
{
memset(dis,0x3f,sizeof dis);
priority_queue< pair<int,int>,vector< pair<int,int> >,greater< pair<int,int> > >Heap;
dis[1]=0;Heap.push(make_pair(0,1));
while(!Heap.empty())
{
int temp=Heap.top().second;
Heap.pop();
if(vis[temp])continue;
vis[temp]=true;
for(int i=Last[temp];i;i=e[i].next)
{
if(dis[e[i].ver]>dis[temp]+e[i].val)
{
dis[e[i].ver]=dis[temp]+e[i].val;
Heap.push(make_pair(dis[e[i].ver],e[i].ver));
}
}
}
}
int main(void)
{
input();
init();
dijkstra();
printf("%d\n",dis[n]);
return 0;
}

<后记>

『The Captain 最短路建图优化』的更多相关文章

  1. [Code+#4] 最短路 - 建图优化,最短路

    最短路问题,然而对于任意\(i,j\),从\(i\)到\(j\)可以只花费\((i xor j) \cdot C\) 对每个点\(i\),只考虑到\(j\)满足\(j=i xor 2^k, j \le ...

  2. BZOJ4383/LuoGuP3588 Pustynia/PUS 线段树建图优化

    我会告诉你我看了很久很久才把题目看懂吗???怀疑智商了 原来他给的l,r还有k个数字都是下标... 比如给了一个样例 l, r, k, x1,x2,x3...xk,代表的是一个数组num[l]~num ...

  3. 『炸弹 线段树优化建图 Tarjan』

    炸弹(SNOI2017) Description 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸 时,如果另一个炸弹所在位置 Xj 满足: Xi−Ri≤Xj≤Xi ...

  4. HDU 5521 [图论][最短路][建图灵感]

    /* 思前想后 还是决定坚持写博客吧... 题意: n个点,m个集合.每个集合里边的点是联通的且任意两点之间有一条dis[i]的边(每个集合一个dis[i]) 求同时从第1个点和第n个点出发的两个人相 ...

  5. hdu4725 The Shortest Path in Nya Graph【最短路+建图】

    转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4297574.html      ---by 墨染之樱花 题目链接:http://acm.hdu ...

  6. Codeforces 938D. Buy a Ticket (最短路+建图)

    <题目链接> 题目大意: 有n座城市,每一个城市都有一个听演唱会的价格,这n座城市由m条无向边连接,每天变都有其对应的边权.现在要求出每个城市的人,看一场演唱会的最小价值(总共花费的价值= ...

  7. HDU5521-最短路-建图

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  8. hdu 5294 Tricks Device 最短路建图+最小割

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Tricks Device Time Limit: 2000/1000 MS (Java/Other ...

  9. hdu 4725 The Shortest Path in Nya Graph (最短路+建图)

    The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

随机推荐

  1. c++/qt的数据序列化和反序列化

    序列化以及反序列化的实现 struct Body { double weight; double height; }; //结构体 struct People { int age; Body dBod ...

  2. APP产品设计及运营时常见的问题

    目录 一.APP设计之初必须预埋的功能 二.H5活动页入口设计 三.全套icon /menu icon / logo图,统一后台设置便于活动推广 四.webview与原生页面的路由应统一改善用户体验 ...

  3. 1.3 正则表达式和python语言-1.3.8 创建字符集([ ])

    1.3.8 创建字符集([ ]) (2018-05-0815:24:00) 下面的示例将说明对于 r2d2|c3po 的限制将比[cr][23][dp][o2]更为严格 import re # 下面的 ...

  4. HDU-AcmKeHaoWanLe训练实录

    菜鸡队训练实录. 现场赛记录:[名称:奖项/排名] 2017: ICPC Shenyang:Gold/3 CCPC Hangzhou:Gold/3 ICPC Beijing:Gold/13 CCPC ...

  5. [POJ1193][NOI1999]内存分配(链表+模拟)

    题意 时 刻 T 内存占用情况 进程事件 0 1 2 3 4 5 6 7 8 9 进程A申请空间(M=3, P=10)<成功> 1 A 2 A B 进程B申请空间(M=4, P=3)< ...

  6. mac效率工具

    前言:在命令行中切换目录是最常用的操作,我相信一遍又一遍重复“cd ls cd ls cd ls ……”绝对会让你抓狂. 记录一下,方便下次系统重装,哈哈 一. oh-my-zsh mac 预装了 z ...

  7. SpringMVC之拦截器的的配置和使用

    拦截器与过滤器的区别:拦截器只能拦截controller的请求,过滤器可以过滤所有请求 (1)实现HandlerInterceptor接口 在执行控制器中的方法之前执行preHandle()中的方法 ...

  8. prometheus+grafana 监控生产环境机器的系统信息、redis、mongodb以及jmx

    介绍: 为了更好的对生产环境的一些中间件和操作系统的运行情况进行可视化的展示,近期了解了下prometheus加上grafana来实现这种效果,由于prometheus是新出来的开源项目,所以,监控的 ...

  9. 小甲鱼Python3笔记

    000-愉快的开始 入门容易,学习难,代码量少. 跨平台: Windows, Mac OS, Linux, UNIX. 应用领域: 操作系统 WEB 3D动画 企业应用 云计算等等. 001-我和Py ...

  10. mvc根据绝对路径下载文件

    首先页面需要一个a标签直接指向下载文件的Action并传值:图片地址,以及图片名称(记住要带后缀名的). 然后是Action里面的代码. SiteHelper.DownloadFile(fileUrl ...