这道题对费用的规定是min(|x1-x2|,|y1-y2|)。如果暴力枚举所有的点复杂度O(n²),n <= 200000,显然爆炸。于是我们要考虑加“有效边”,一个显然的事实是对于两个点,如果经过不在两点连线上的第三个点中转得到的费用之和一定比直接连边小。所以考虑排个序,分别按照x、y排序,依次加边,有点类似贪心的思想,让每次加边的费用尽可能小,然后跑下dijkstra就行。注意,本题卡SPFA。

P.S 我之前WA了好几次的原因是inf不够大QAQ,每个点坐标<=1e9,inf开1e10才行。或者memset(dis,127,sizeof(dis));

SPFA死了!!!

#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#include<algorithm>
#define N 200010
#define M 800010
#include<iostream>
#define inf 1e10
using namespace std;
struct dij
{
int u,dis;
bool operator < (const dij &a) const
{
return dis > a.dis;
}
};
struct point
{
int x,y,id;
}p[N];
int head[N],nxt[M],to[M],val[M],dis[N];
int n,cnt;
void add(int u,int v,int w)
{
cnt++;
nxt[cnt] = head[u];
head[u] = cnt;
val[cnt] = w;
to[cnt] = v;
}
bool vis[N];
void dijkstra(int s)
{
memset(dis,,sizeof(dis));
dis[s] = ;
priority_queue<dij>q;
dij top,qwq;
top.u = s;
top.dis = ;
q.push(top);
while(q.size())
{
top = q.top();
q.pop();
int u = top.u;
if(vis[u]) continue;
vis[u] = ;
for(int i = head[u];i;i = nxt[i])
{
int v = to[i];
if(u == v) continue;
if(dis[v] > dis[u] + val[i])
{
dis[v] = dis[u] + val[i];
qwq.u = v;
qwq.dis = dis[v];
q.push(qwq);
}
}
}
return;
}
bool cmp1(point a,point b)
{
if(a.x == b.x) return a.y > b.y;
return a.x > b.x;
}
bool cmp2(point a,point b)
{
if(a.y == b.y) return a.x > b.x;
return a.y > b.y;
}
int main()
{
scanf("%d",&n);
for(int i = ;i <= n;i++)
{
scanf("%d %d",&p[i].x,&p[i].y);
p[i].id = i;//排序后编号会变,用id存下每个点之前的编号
}
sort(p + ,p + + n,cmp1);
for(int i = ;i < n;i++)
{
add(p[i].id,p[i + ].id,p[i].x - p[i + ].x);
add(p[i + ].id,p[i].id,p[i].x - p[i + ].x);
}
sort(p + ,p + + n,cmp2);
for(int i = ;i < n;i++)
{
add(p[i].id,p[i + ].id,p[i].y - p[i + ].y);
add(p[i + ].id,p[i].id,p[i].y - p[i + ].y);
}
dijkstra();
printf("%d\n",dis[n]);
}

[BZOJ 4152][AMPPZ 2014]The Captain的更多相关文章

  1. bzoj 4152[AMPPZ2014]The Captain

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

  2. 循环队列+堆优化dijkstra最短路 BZOJ 4152: [AMPPZ2014]The Captain

    循环队列基础知识 1.循环队列需要几个参数来确定 循环队列需要2个参数,front和rear 2.循环队列各个参数的含义 (1)队列初始化时,front和rear值都为零: (2)当队列不为空时,fr ...

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

    先按x排序, 然后只有相邻节点的边才有用, 我们连起来, 再按y排序做相同操作...然后就dijkstra ---------------------------------------------- ...

  4. 【AMPPZ 2014】 The Captain

    [题目链接] 点击打开链接 [算法] 按x轴排序,将相邻点连边 按y轴排序,将相邻点连边 然后对这个图跑最短路就可以了,笔者用的是dijkstra算法 [代码] #include<bits/st ...

  5. BZOJ 4152: [AMPPZ2014]The Captain Dijkstra+贪心

    Code: #include <queue> #include <cstdio> #include <cstring> #include <algorithm ...

  6. BZOJ 3672 NOI 2014 购票

    题面 Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ市为根的有根树,每个城市 ...

  7. [BZOJ 3530][Sdoi 2014]数数

    阿拉~好像最近总是做到 AC 自动机的题目呢喵~ 题目的算法似乎马上就能猜到的样子…… AC 自动机 + 数位 dp 先暴力转移出 f[i][j] :表示从 AC 自动机上第 j 号节点走 i 步且不 ...

  8. [BZOJ 3503][Cqoi 2014]和谐矩阵

    我觉得这一题的样例输出一点都不和谐,大家千万别像我一样被坑了…… 题目不算难,果然是进错省系列555,不过搞出 O(n*m*2m) 的还是不要挣扎的比较好 我们暴力地推出第 n 行 第 m 列中每个数 ...

  9. BZOJ 3533 sdoi 2014 向量集

    设(x,y)为Q的查询点,分类讨论如下:1.y>0:  最大化a*x+b*y,维护一个上凸壳三分即可 2.y<0:最大化a*x+b*y  维护一个下凸壳三分即可 我们考虑对时间建出一棵线段 ...

随机推荐

  1. [20190419]shared latch spin count.txt

    [20190419]shared latch spin count.txt --//昨天测试exclusive latch spin count = 20000(缺省).--//今天测试shared ...

  2. 从0开始的Python学习013编写一个Python脚本

    通过之前的学习我们已经了解了Python的很多基础运用了,现在我们尝试着做一个有使用价值的小脚本. 问题 需求: 我想要一个可以给我备份重要文件的程序. 需求分析: 首先文件是有存储路径,文件的路径和 ...

  3. 移动端click延迟和tap事件

    一.click等事件在移动端的延迟 click事件在移动端和pc端均可以触发,但是在移动端有延迟现象. 1.背景 由于早期移动设备浏览网页时内容较小,为了增强用户体验,苹果公司专门为移动设备设计了双击 ...

  4. ARMV8体系结构简介

    armv8 1.前言 本文的主要内容来源于ARMV8白皮书v5,对ARMV8做一个概述.包含如下的内容: 首先从背景谈起,讲述ARM的发展历程: 之后介绍ARMV8体系结构的基本特征: 介绍A64指令 ...

  5. web安全基础第一天

    编码:url编码 base64编码:末尾有俩个==号 md5加密:16位或者32位 1.whois查询  :站长邮箱,联系人,备案 旁站c段&子域名. ( 大数据平台和bing接口查询 :Zo ...

  6. Windows系统在本地配置一个apache域名的方法

    我使用的xampp 1.修改C:\Windows\System32\drivers\etc中的hosts文件,添加127.0.0.1 www.feiquan.com 2.修改D:\xampp\apac ...

  7. 随机IP

    function rand_ip(){ $ip_longs = array( array('607649792', '608174079'),        //36.56.0.0-36.63.255 ...

  8. ABP之session

    ABP提供了一个IAbpSession接口,可以在不使用ASPNET的session的情况下获取当前用户和租户.IAbpSession还被ABP中的其他结构(如设置和授权系统)完全集成和使用. 注入s ...

  9. Python----多元线性回归

    多元线性回归 1.多元线性回归方程和简单线性回归方程类似,不同的是由于因变量个数的增加,求取参数的个数也相应增加,推导和求取过程也不一样.. y=β0+β1x1+β2x2+ ... +βpxp+ε 对 ...

  10. Mysql [Err] 1292 - Truncated incorrect DOUBLE value

    Mysql [Err] 1292 - Truncated incorrect DOUBLE value: 'a' - 苍 - 博客园 https://www.cnblogs.com/cang12138 ...