BZOJ4152 The Captain


题面很简洁:

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

很明显这是道最短路

我们知道在求最短路时本身就要不断求min

所以相对于拐弯抹角的横纵差的较小值,我们完全可以无视这个求min

转为建|x1-x2|,|y1-y2|两条边

最后跑一遍最短路即可

(ps.这题是卡SPFA的)


IO优化、头文件啥的就自己yy一下吧

#define int long long
const int N=2e5+5,M=N<<2;
int n,m,s,h[N],en,dis[N];
struct point{int i,x,y;}a[N]; //存点坐标
struct node{ //松弛操作中的节点
int x,v;
inline bool operator < (const node &nt) const {
return v>nt.v;
}
};
struct edge{int n,v,w;}e[M]; //前向星边表
void add(int x,int y,int z){e[++en]=(edge){h[x],y,z};h[x]=en;} //加边
void dij(int s){ //dij模板
priority_queue<node> q;
memset(dis,66,sizeof dis);
q.push((node){s,0});
dis[s]=0;
while(!q.empty()){
node x=q.top();
q.pop();
if(x.v!=dis[x.x]) continue; //一个dij懒惰操作,省去了visit[]数组
for(int i=h[x.x];i;i=e[i].n){
int y=e[i].v;
if(dis[x.x]+e[i].w<dis[y]){
dis[y]=dis[x.x]+e[i].w;
q.push((node){y,dis[y]});
}
}
}
}
inline bool cmpx(const point &x,const point &y){return x.x==y.x?x.y<y.y:x.x<y.x;}
inline bool cmpy(const point &x,const point &y){return x.y==y.y?x.x<y.x:x.y<y.y;}
signed main(){
read(n);
for(int i=1;i<=n;i++)
a[i].i=i,read(a[i].x),read(a[i].y);
sort(a+1,a+1+n,cmpx); //按横坐标排
for(int i=2;i<=n;i++)
add(a[i-1].i,a[i].i,a[i].x-a[i-1].x), //前后节点建双向边
add(a[i].i,a[i-1].i,a[i].x-a[i-1].x);
sort(a+1,a+1+n,cmpy); //按纵坐标排
for(int i=2;i<=n;i++)
add(a[i-1].i,a[i].i,a[i].y-a[i-1].y),
add(a[i].i,a[i-1].i,a[i].y-a[i-1].y);
dij(1);
printf("%lld",dis[n]);
}

BZOJ4152 The Captain(dijkstra+巧妙建图)的更多相关文章

  1. 2018.10.30 NOIP模拟 有环无向图(dijkstra+巧妙建图)

    传送门 建图巧妙啊. 对于每个点的出边,我们将它们排序之后依次连边. 这样可以把O(m2)O(m^2)O(m2)的边数变成O(m)O(m)O(m)的了. 连的权值就是max(edgemax(edgem ...

  2. HDU5521 Meeting(dijkstra+巧妙建图)

    HDU5521 Meeting 题意: 给你n个点,它们组成了m个团,第i个团内有si个点,且每个团内的点互相之间距离为ti,问如果同时从点1和点n出发,最短耗时多少相遇 很明显题目给出的是个无负环的 ...

  3. 『The Captain 最短路建图优化』

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

  4. HDU5772 String problem 最大权闭合图+巧妙建图

    题意:自己看吧(不是很好说) 分析: 网络流:最大权闭合子图. 思路如下: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得 ...

  5. 【算法系列学习】巧妙建图,暴搜去重 Counting Cliques

    E - Counting Cliques http://blog.csdn.net/eventqueue/article/details/52973747 http://blog.csdn.net/y ...

  6. POJ-1122 FDNY to the Rescue!---Dijkstra+反向建图

    题目链接: https://vjudge.net/problem/POJ-1122 题目大意: 给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路 ...

  7. [Bzoj4289]PA2012 Tax(Dijkstra+技巧建图)

    Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...

  8. UVA1327 && POJ1904 King's Quest(tarjan+巧妙建图+强连通分量+缩点)

    UVA1327 King's Quest POJ1904 King's Quest 题意: 有n个王子,每个王子都有k个喜欢的妹子,每个王子只能和喜欢的妹子结婚.现有一个匹配表,将每个王子都与一个自己 ...

  9. bzoj4152 The Captain (dijkstra)

    做dijkstra,但只需要贪心地把每个点连到它左边.右边.上边.下面的第一个点就可以了 #include<bits/stdc++.h> #define pa pair<int,in ...

随机推荐

  1. GIS基础软件及操作(十一)

    原文 GIS基础软件及操作(十一) 练习十一.3D 可视分析 1.对地理数据进行透视观察.三维浏览:2.制作飞行动画 GIS数据三维显示 (1) 运行程序:[开始菜单]>>[所有程序]&g ...

  2. C# 利用 OpenCV 进行视频捕获 (笔记)

    原文:C# 利用 OpenCV 进行视频捕获 (笔记) 简介 这个项目是关于如何从网络摄像头或者视频文件(*.AVI)中捕获视频的,这个项目是用C#和OPENCV编写的. 这将有助于那些喜欢C#和Op ...

  3. 使用 GNU autotools 改造一个软件项目

    使用 GNU autotools 改造一个软件项目 及永刚 jungle@soforge.com 2006 年 3 月 24 日  版本:0.3 本文不是一篇规范的教程,而是用一个软件项目作为例子,演 ...

  4. 实现Qt日志功能并输出到文件(使用qInstallMsgHandler安装customMessageHandler)good

    原文 http://www.cppblog.com/lauer3912/archive/2011/04/10/143870.html 一.基本分类:qDebug : 调试信息提示qWarning: 一 ...

  5. 今天想安装 windowsl ive 提示安装失败 错误码

    Windows Live installation error: OnCatalogResult: 0x80072ee6 看了了这个老兄的回答,试了试,果然OK,谢谢@普洛提亚从这里下载安装包,然后安 ...

  6. Python连载10-os包函数(续)

    一.os包(接连载9) 1.函数:system() (1)用法:运行系统shell命令 (2)格式:os.system(系统命令) (3)返回值:打开一个shell或终端界面 (4)注意:一般是用su ...

  7. 对SpringMVC架构进行工程拆分遇到的问题总结

    经过一个月的开发,一个单一的SpringMVC教育类创业项目正式上线,随着时间的推移,业务流量逐渐增大,最近对这个单一的工程从零进行SOA分布式改造,改造包括dubbo改造,集成化部署.高可用集群,负 ...

  8. 01 Javascript简介(了解)

    Web前端有三层: HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化页面) JavaScript:从交互的角度,描述行为(提升用户体验) JavaScript历史背景介绍 布 ...

  9. 分享Sql Server 2008 r2 数据备份,同步服务器数据(二.本地发布,订阅)

    上一篇文章中写到了数据库的本地备份,这一篇主要分享一下关于不同服务器的数据备份,主要是使用sql server中的本地发布,本地订阅功能,在数据库的读写分离中,也会经常性的用到这个功能. 复制-> ...

  10. linux下用户权限划分

    场景: 建立一个目录为/devcode,该目录是给开发组用的,也就是只有开发组用户才能进行操作该目录.该组下有成员zhangsan,lisi  步骤: 1.创建用户组,命名dev groupadd d ...