BZOJ4152 The Captain(dijkstra+巧妙建图)
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+巧妙建图)的更多相关文章
- 2018.10.30 NOIP模拟 有环无向图(dijkstra+巧妙建图)
传送门 建图巧妙啊. 对于每个点的出边,我们将它们排序之后依次连边. 这样可以把O(m2)O(m^2)O(m2)的边数变成O(m)O(m)O(m)的了. 连的权值就是max(edgemax(edgem ...
- HDU5521 Meeting(dijkstra+巧妙建图)
HDU5521 Meeting 题意: 给你n个点,它们组成了m个团,第i个团内有si个点,且每个团内的点互相之间距离为ti,问如果同时从点1和点n出发,最短耗时多少相遇 很明显题目给出的是个无负环的 ...
- 『The Captain 最短路建图优化』
The Captain(BZOJ 4152) Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小 ...
- HDU5772 String problem 最大权闭合图+巧妙建图
题意:自己看吧(不是很好说) 分析: 网络流:最大权闭合子图. 思路如下: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得 ...
- 【算法系列学习】巧妙建图,暴搜去重 Counting Cliques
E - Counting Cliques http://blog.csdn.net/eventqueue/article/details/52973747 http://blog.csdn.net/y ...
- POJ-1122 FDNY to the Rescue!---Dijkstra+反向建图
题目链接: https://vjudge.net/problem/POJ-1122 题目大意: 给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路 ...
- [Bzoj4289]PA2012 Tax(Dijkstra+技巧建图)
Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...
- UVA1327 && POJ1904 King's Quest(tarjan+巧妙建图+强连通分量+缩点)
UVA1327 King's Quest POJ1904 King's Quest 题意: 有n个王子,每个王子都有k个喜欢的妹子,每个王子只能和喜欢的妹子结婚.现有一个匹配表,将每个王子都与一个自己 ...
- bzoj4152 The Captain (dijkstra)
做dijkstra,但只需要贪心地把每个点连到它左边.右边.上边.下面的第一个点就可以了 #include<bits/stdc++.h> #define pa pair<int,in ...
随机推荐
- Win8Metro(C#)数字图像处理--2.10图像中值滤波
原文:Win8Metro(C#)数字图像处理--2.10图像中值滤波 [函数名称] 图像中值滤波函数MedianFilterProcess(WriteableBitmap src) [函数代码] ...
- 如何线程调用C++类成员函数
方法就是: 1,写成静态成员函数 2,参数为 (void* __this)用来传入类 对象指针(this) 3,进入函数首先 C类名 *_this = (C类名*)__this; 转化为对象指 ...
- 使用xargs同步文本中单词出现个数
#!/bin/bash # 分析一个文本文件中单词出现的频率. # 使用 'xargs' 将文本行分解为单词. # 检查命令行上输入的文件. ARGS= E_BADARGS= E_NOFILE= if ...
- ML:吴恩达 机器学习 课程笔记(Week9~10)
Anomaly Detection Recommender Systems Large Scale Machine Learning
- 搜索栏+collectionView实现
效果图如下: 1.h文件声明方法: @interface IDSGameRoomSearchPage : UIView @property (nonatomic,weak) BaseVie ...
- 使用Scrapy爬取图片入库,并保存在本地
使用Scrapy爬取图片入库,并保存在本地 上 篇博客已经简单的介绍了爬取数据流程,现在让我们继续学习scrapy 目标: 爬取爱卡汽车标题,价格以及图片存入数据库,并存图到本地 好了不多说,让我们实 ...
- hgoi#20190513
T1-Felicity is Coming! 神奇宝贝的进化方案是一个全排列,假设有三种宝可梦,那么对应就可以有: (1,2,3)(1,3,2)(2,1,3)(2,3,1)(3,1,2)(3,2,1) ...
- 管理分布式session的四种方式。
应用服务器的高可用架构设计最为理想的是服务无状态,但实际上业务总会有状态的,以session记录用户信息的例子来讲,未登入时,服务器没有记入用户信息的session访问网站都是以游客方式访问的,账号密 ...
- 27 background
先来讲讲颜色表示法 一共有三种:单词.rgb表示法.十六进制表示法 rgb:红色 绿色 蓝色 三原色 光学显示器,每个像素都是由三原色的发光原件组成的,靠明亮度不同调成不同的颜色的. 用逗号隔开,r. ...
- Git 备忘录
整理了一下工作中常用的 Git 操作,持续更新中... merge单个文件 例如 B分支想要合并A分支的某个文件 首先,我们切换到B分支 git checkout branch B 之后,我们c ...