[BZOJ4152][AMPPZ2014]The Captain题解
The Captain
文章目录
- The Captain
- 题目描述
- 分析
- 代码
题目描述
给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用。
分析
我们第一时间会想把所有点都连上边,这样在跑一遍dijkstra,不就可以了吗?
但是
对于100%的数据,n<=200000
那我们就想一下如何优化呢
我从样例哪里拿来3个数来看一下
id | x | y |
---|---|---|
1 | 2 | 2 |
2 | 1 | 1 |
3 | 4 | 5 |
1到2,需要min(∣X1−X2∣,∣Y1−Y2∣)=1费用min(|X_1-X_2|,|Y_1-Y_2|)=1费用min(∣X1−X2∣,∣Y1−Y2∣)=1费用
1到3,需要min(∣X1−X3∣,∣Y1−Y3∣)=2费用min(|X_1-X_3|,|Y_1-Y_3|)=2费用min(∣X1−X3∣,∣Y1−Y3∣)=2费用
2到3,需要min(∣X2−X3∣,∣Y2−Y3∣)=3费用min(|X_2-X_3|,|Y_2-Y_3|)=3费用min(∣X2−X3∣,∣Y2−Y3∣)=3费用
1+2=31+2=31+2=3难道是巧合?
我们来分析一下
- 如果∣X1−X2∣|X_1-X_2|∣X1−X2∣和∣X1−X3∣|X_1-X_3|∣X1−X3∣都是最小或最大的话,那么把X1X_1X1当成中转站∣X1−X2∣+∣X1−X3∣=∣X2−X3∣|X_1-X_2|+|X_1-X_3|=|X_2-X_3|∣X1−X2∣+∣X1−X3∣=∣X2−X3∣、
- 如果∣X1−X2∣|X_1-X_2|∣X1−X2∣和∣X1−X3∣|X_1-X_3|∣X1−X3∣是一个大,一个小的话,那么把X1X_1X1当成中转站∣X1−X2∣+∣X1−X3∣<∣X2−X3∣|X_1-X_2|+|X_1-X_3|<|X_2-X_3|∣X1−X2∣+∣X1−X3∣<∣X2−X3∣
所以我们可以把XXX排序,相邻存边;在把YYY排序,相邻存边,一共存4n4n4n条边
这部分的代码我就不放了,到后面去看吧
代码
有点长
#include<bits/stdc++.h>
using namespace std;
int n,d[200010];
struct node
{int x,y,id;
}a[200010];
struct edge
{int x,s;bool operator<(const edge&a)const{return s>a.s;}
};
bool cmpx(node a,node b)
{if(a.x==b.x)return a.y<b.y;return a.x<b.x;
}
bool cmpy(node a,node b)
{if(a.y==b.y)return a.x<b.x;return a.y<b.y;
}
int f(node a,node b)
{return min(abs(a.x-b.x),abs(a.y-b.y));
}
vector<edge> v[200010];
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i].x>>a[i].y;a[i].id=i;}sort(a+1,a+n+1,cmpx);for(int i=1;i<n;i++){v[a[i].id].push_back(edge{a[i+1].id,f(a[i],a[i+1])});v[a[i+1].id].push_back(edge{a[i].id,f(a[i],a[i+1])});}sort(a+1,a+n+1,cmpy);for(int i=1;i<n;i++){v[a[i].id].push_back(edge{a[i+1].id,f(a[i],a[i+1])});v[a[i+1].id].push_back(edge{a[i].id,f(a[i],a[i+1])});}priority_queue<edge> q;q.push(edge{1,0});for(int i=2;i<=n;i++)d[i]=1e9;while(!q.empty()){edge x=q.top();q.pop();if(x.s!=d[x.x])continue;for(int i=0;i<v[x.x].size();i++){edge y=v[x.x][i];if(d[y.x]>d[x.x]+y.s){d[y.x]=d[x.x]+y.s;q.push(edge{y.x,d[x.x]+y.s});}}}cout<<d[n];
}
祝大家AC大吉
[BZOJ4152][AMPPZ2014]The Captain题解相关推荐
- BZOJ4152 AMPPZ2014 The Captain(最短路)
事实上每次走到横坐标或纵坐标最接近的点一定可以取得最优方案.于是这样连边跑最短路就可以了. #include<iostream> #include<cstdio> #inclu ...
- bzoj4152: [AMPPZ2014]The Captain
水... 这个建边排序一下从一边连向一边 dij在这种稀疏图果然不够优秀啊.只是学了一发. #include<cstdio> #include<iostream> #inclu ...
- bzoj4152 [AMPPZ2014]The Captain
Description 给定平面上的 \(n\) 个点,定义 \((x_1,y_1)\) 到 \((x_2,y_2)\) 的费用为 \(\min(|x_1-x_2|,|y_1-y_2|)\) ,求从 ...
- 4152. [AMPPZ2014]The Captain(稠密图最短路)
4152. [AMPPZ2014]The Captain 显然稠密图的边数时n2n^2n2量级,我们不可能把所有边建立出来,这时候通常寻求一些性质详细见[论题选编]稠密图最短路 针对本题我们可以先这样 ...
- 【BZOJ】4152: [AMPPZ2014]The Captain【SLF优化Spfa】
4152: [AMPPZ2014]The Captain Time Limit: 20 Sec Memory Limit: 256 MB Submit: 2107 Solved: 820 [Sub ...
- BZOJ 4152: [AMPPZ2014]The Captain(最短路)
Time Limit: 20 Sec Memory Limit: 256 MB Submit: 1550 Solved: 619 [Submit][Status][Discuss] Descrip ...
- 2019.4.summary
2019.4.1 BZOJ1061: [Noi2008]志愿者招募 真心有点难QAQ https://www.byvoid.com/zhs/blog/noi-2008-employee 看void爷的 ...
- 一句话题解(20170801~20170125)
8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...
- python画热力图_Python中绘制场景热力图
原博文 2019-08-06 15:39 − 我们在做诸如人群密集度等可视化的时候,可能会考虑使用热力图,在Python中能很方便地绘制热力图. 下面以识别图片中的行人,并绘制热力图为例进行讲解. 步 ...
- bzoj4152 The Captain (dijkstra)
做dijkstra,但只需要贪心地把每个点连到它左边.右边.上边.下面的第一个点就可以了 1 #include<bits/stdc++.h> 2 #define pa pair<in ...
最新文章
- 微信高级研究员解析深度学习在NLP中的发展和应用 | 公开课笔记
- python 笔记 haversine (两个经纬度坐标之间的距离)
- mysql错误:file xxx conflicts with file from package mysql-libs-5.5.68-1.el7.x86_64
- SVN提交,提示“remains in conflict”错误
- redis(16)--sentinel
- python连接sqlite数据库的代码_Python3实现连接SQLite数据库的方法
- UvaLive 6664 Clock Hands
- wifi抓包解读(实战教程)
- 2022-2027年(新版)中国工程造价咨询行业现状动态与未来前景预测报告
- c4d阿诺德渲染器支持a卡吗_C4D常用的4大主流渲染器如何选择与比较 (OC/RS/VR/阿诺德)...
- 使用Jflash给华大半导体的MCU烧录程序
- 2018南邮全国计算机大赛,我院承办2018全国大学生物联网设计竞赛(TI杯)南京邮电大学选拔赛...
- android手机自带浏览器无法识别apk文件
- vscode 用户设置与工作区设置
- AVPro批量制作视频缩略图
- 【JY】浅谈混凝土结构/构件性能试验指标概念(二)
- 路由器、交换机、网桥、集线器的区别和联系
- python 创建目录时间_python实现根据当前时间创建目录并输出日志
- 大连鸿蒙刺青怎么样,哪个部位纹身最“疼”?纹身师:敢在这三个地方纹身的,是真汉子...
- 乐高计算机游戏泡泡龙教案,疯狂泡泡龙(400关)
热门文章
- 图片批量添加水印批量加背景缩放批量合并工具picUnionV4.0
- html5文字游戏制作工具,橙光文字游戏制作工具
- Android 设置无线热点模块隐藏SSID
- 国家代码查询(Country codes)
- 电影图标-黑客帝国(The Matrix)
- 2022-2028年中国直线电机行业市场现状分析及投资前景评估报告
- 中科大自主招生2018年笔试数学之四
- mysql 综合练习
- Lcb小粉书隐私政策
- matlab 跳步,给定两个大整数u和v,它们分别有m和n位数字,且m≤n.用通常的乘法求uv的值需要O(mn)时间.可以将u和v.. - 上学吧找答案(手机版)...