这道题对费用的规定是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. asp.net动态添加控件学习

    看了老师的教程后,自己一点感悟记录下来: 1.在页面提交后,动态生成的控件会丢失, 但如果生成控件的代码在pageload中,就可以,原理是每次生成页面都执行生成. 2.动态按件或页面原来控件, 在页 ...

  2. Python 之Web编程

    一 .HTML是什么? htyper text markup language 即超文本标记语言 超文本:就是指页面内可以包含图片.链接.甚至音乐.程序等非文字元素 标记语言:标记(标签)构成的语言 ...

  3. 服务消费者Feign和Ribbon的区别

    1.Ribbon通过注解@EnableEurekaClient/@EnableDiscoveryClient向服务中心注册:    PS:选用的注册中心是eureka,那么就推荐@EnableEure ...

  4. Flink打包生成安装包缺少jar包

    官方默认打包生成的安装包的flink-release-1.7.0\flink-dist\target\flink-1.7.0-bin\flink-1.7.0\lib下缺少jar flink-dist项 ...

  5. python接口自动化-session_自动发文

    一.session简介 查看 requests.session() 帮助文档(只贴了一部分内容) import requests help(requests.session()) class Sess ...

  6. go学习笔记(一)

  7. php之微信公众号发送模板消息

    讲一下开发项目中微信公众号发送模板消息的实现过程(我用的还是Thinkphp5.0). 先看一下效果,如图: 就是类似于这样的,下面讲一下实现过程: 第一步:微信公众号申请模板消息权限: 立即申请: ...

  8. handsontable的基础应用

    handsontable是一款页面端的表格式交互插件,可以通过她加载显示表格内容,能够支持合并项.统计.行列拖动等. 同时,支持对加载后的表格页面的处理:添加/删除行/列,合并单元格等操作. 我在项目 ...

  9. Elastic Stack-Elasticsearch使用介绍(三)

    一.前言     上一篇说了这篇要讲解Search机制,但是在这个之前我们要明白下文件是怎么存储的,我们先来讲文件的存储然后再来探究机制: 二.文档存储 之前说过文档是存储在分片上的,这里要思考一个问 ...

  10. Django-admin管理工具

    知识预览 admin组件使用 admin源码解析 admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目 ...