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题解相关推荐

  1. BZOJ4152 AMPPZ2014 The Captain(最短路)

    事实上每次走到横坐标或纵坐标最接近的点一定可以取得最优方案.于是这样连边跑最短路就可以了. #include<iostream> #include<cstdio> #inclu ...

  2. bzoj4152: [AMPPZ2014]The Captain

    水... 这个建边排序一下从一边连向一边 dij在这种稀疏图果然不够优秀啊.只是学了一发. #include<cstdio> #include<iostream> #inclu ...

  3. bzoj4152 [AMPPZ2014]The Captain

    Description 给定平面上的 \(n\) 个点,定义 \((x_1,y_1)\) 到 \((x_2,y_2)\) 的费用为 \(\min(|x_1-x_2|,|y_1-y_2|)\) ,求从 ...

  4. 4152. [AMPPZ2014]The Captain(稠密图最短路)

    4152. [AMPPZ2014]The Captain 显然稠密图的边数时n2n^2n2量级,我们不可能把所有边建立出来,这时候通常寻求一些性质详细见[论题选编]稠密图最短路 针对本题我们可以先这样 ...

  5. 【BZOJ】4152: [AMPPZ2014]The Captain【SLF优化Spfa】

    4152: [AMPPZ2014]The Captain Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 2107  Solved: 820 [Sub ...

  6. BZOJ 4152: [AMPPZ2014]The Captain(最短路)

    Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 1550  Solved: 619 [Submit][Status][Discuss] Descrip ...

  7. 2019.4.summary

    2019.4.1 BZOJ1061: [Noi2008]志愿者招募 真心有点难QAQ https://www.byvoid.com/zhs/blog/noi-2008-employee 看void爷的 ...

  8. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

  9. python画热力图_Python中绘制场景热力图

    原博文 2019-08-06 15:39 − 我们在做诸如人群密集度等可视化的时候,可能会考虑使用热力图,在Python中能很方便地绘制热力图. 下面以识别图片中的行人,并绘制热力图为例进行讲解. 步 ...

  10. bzoj4152 The Captain (dijkstra)

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

最新文章

  1. 微信高级研究员解析深度学习在NLP中的发展和应用 | 公开课笔记
  2. python 笔记 haversine (两个经纬度坐标之间的距离)
  3. mysql错误:file xxx conflicts with file from package mysql-libs-5.5.68-1.el7.x86_64
  4. SVN提交,提示“remains in conflict”错误
  5. redis(16)--sentinel
  6. python连接sqlite数据库的代码_Python3实现连接SQLite数据库的方法
  7. UvaLive 6664 Clock Hands
  8. wifi抓包解读(实战教程)
  9. 2022-2027年(新版)中国工程造价咨询行业现状动态与未来前景预测报告
  10. c4d阿诺德渲染器支持a卡吗_C4D常用的4大主流渲染器如何选择与比较 (OC/RS/VR/阿诺德)...
  11. 使用Jflash给华大半导体的MCU烧录程序
  12. 2018南邮全国计算机大赛,我院承办2018全国大学生物联网设计竞赛(TI杯)南京邮电大学选拔赛...
  13. android手机自带浏览器无法识别apk文件
  14. vscode 用户设置与工作区设置
  15. AVPro批量制作视频缩略图
  16. 【JY】浅谈混凝土结构/构件性能试验指标概念(二)
  17. 路由器、交换机、网桥、集线器的区别和联系
  18. python 创建目录时间_python实现根据当前时间创建目录并输出日志
  19. 大连鸿蒙刺青怎么样,哪个部位纹身最“疼”?纹身师:敢在这三个地方纹身的,是真汉子...
  20. 乐高计算机游戏泡泡龙教案,疯狂泡泡龙(400关)

热门文章

  1. 图片批量添加水印批量加背景缩放批量合并工具picUnionV4.0
  2. html5文字游戏制作工具,橙光文字游戏制作工具
  3. Android 设置无线热点模块隐藏SSID
  4. 国家代码查询(Country codes)
  5. 电影图标-黑客帝国(The Matrix)
  6. 2022-2028年中国直线电机行业市场现状分析及投资前景评估报告
  7. 中科大自主招生2018年笔试数学之四
  8. mysql 综合练习
  9. Lcb小粉书隐私政策
  10. matlab 跳步,给定两个大整数u和v,它们分别有m和n位数字,且m≤n.用通常的乘法求uv的值需要O(mn)时间.可以将u和v.. - 上学吧找答案(手机版)...