<更新提示>

<第一次更新>


<正文>

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. js实现页面重新加载

    https://blog.csdn.net/wangjian530/article/details/80596801

  2. Eclipse 那些小技巧(值得收藏)

    1.菜单命令系列 Edit→content Assist→add Alt+/ 代码关联 Windows→Next Editor→add Ctrl+Tab 切换窗口 Run→Debug Toggle L ...

  3. myBase Desktop 6.5.1 无限期试用

    清空安装目录下的"nyfedit.ini"文件的"App.UserLic.FirstUseOn="配置项的值

  4. Pytoch机器学习乱玩(一):数学建模作业,体重与心率

    动物心率与体重的模型 动物消耗的能量p主要用于维持体温,而体内热量通过其表面积S散失,记动物体重为w,则\(P \propto S \propto w^{\alpha}\).又\(P\)正比于血流量\ ...

  5. spring-boot-starter-actouator2.1.4与c3p0版本0.9.1.2冲突

    报错前的pom文件: <?xml version="1.0" encoding="UTF-8"?><project xmlns="h ...

  6. 使用Cordova打包Vue项目

    因为公司项目要求, 原本的vue移动端项目, 现在要求能使用定位, 调用摄像头等功能, 并且开发成混合APP. 一个小白的孤军奋战史, 记录一下, 以备后用.... 第一步: 安装cordova 在命 ...

  7. SpringBoot使用Sharding-JDBC读写分离

    本文介绍SpringBoot使用当当Sharding-JDBC进行读写分离. 1.有关Sharding-JDBC 本文还是基于当当网Sharding-Jdbc的依赖,与上一篇使用Sharding-Jd ...

  8. W3C的标准到底是啥?

    1.图片的alt="" 属性必须每张图片都加上,而且对齐属性用CSS来定义.不加不能通过XHTML 1.0的验证. 2.每个文档必须加上DTD声明. a) !DOCTYPE htm ...

  9. USCiLab cereal json 序列化

    cereal json 序列化 https://blog.csdn.net/sunnyloves/article/details/51373793?utm_source=blogxgwz8 http: ...

  10. 自行搭建私有云kodexplorer

    kodexplorer是一款开源的私有云框架,可以通过它实现个人网盘的功能,如果拥有一个性能不错的VPS,那么就可以摆脱奇慢无比的百度云等网盘啦!最近百度网盘还发出申明,说要限制使用空间.用别人的东西 ...