当前位置:
首页 >
[BZOJ4152][AMPPZ2014]The Captain题解
发布时间:2023/12/16
43
豆豆
生活随笔
收集整理的这篇文章主要介绍了
[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个数来看一下
| 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题解的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: USB3.0剖析(锆石科技FPGA)
- 下一篇: 运动蓝牙耳机挑选要注意什么?蓝牙耳机知识