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

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

------------------------------------------------------------------------

#include<cstdio>

#include<cstring>

#include<algorithm>

#include<iostream>

#include<queue>

#include<cmath>

#define rep(i, n) for(int i = 0; i < n; i++)

#define clr(x, c) memset(x, c, sizeof(x))

using namespace std;

const int inf = 1000000009, maxn = 200009;

struct edge {

int to, w;

edge*next;

} E[maxn << 2], *pt = E, *head[maxn];

struct node {

int x, d;

bool operator < (const node&o) const {

return d > o.d;

}

};

struct P {

int x, y;

inline void Read() {

scanf("%d%d", &x, &y);

}

} A[maxn];

inline void add(int u, int v, int w) {

pt->to = v, pt->w = w;

pt->next = head[u];

head[u] = pt++;

}

#define add_edge(u, v, w) add(u, v, w), add(v, u, w)

bool cmpX(const int i, const int j) {

return A[i].x < A[j].x;

}

bool cmpY(const int i, const int j) {

return A[i].y < A[j].y;

}

int d[maxn], n, X[maxn], Y[maxn];

priority_queue<node> Q;

void dijkstra() {

rep(i, n) d[i] = inf;

d[0] = 0, Q.push( (node) {0, 0} );

while(!Q.empty()) {

node t = Q.top(); Q.pop();

if(d[t.x] != t.d) continue;

for(edge*e = head[t.x]; e; e = e->next) if(d[e->to] > d[t.x] + e->w) {

d[e->to] = d[t.x] + e->w;

Q.push( (node) {e->to, d[e->to]} );

}

}

}

int main() {

freopen("test.in", "r", stdin);

cin >> n;

rep(i, n) {

A[i].Read();

X[i] = Y[i] = i;

}

sort(X, X + n, cmpX);

rep(i, n - 1) {

P*a = A + X[i], *b = A + X[i + 1];

if(b->x - a->x <= abs(a->y - b->y)) add_edge(X[i], X[i + 1], b->x - a->x);

}

sort(Y, Y + n, cmpY);

rep(i, n - 1) {

P*a = A + Y[i], *b = A + Y[i + 1];

if(b->y - a->y <= abs(a->x - b->x)) add_edge(Y[i], Y[i + 1], b->y - a->y);

}

dijkstra();

printf("%d\n", d[n - 1]);

return 0;

}

------------------------------------------------------------------------

4152: [AMPPZ2014]The Captain

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 272  Solved: 104
[Submit][Status][Discuss]

Description

给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用。

Input

第一行包含一个正整数n(2<=n<=200000),表示点数。

接下来n行,每行包含两个整数x[i],y[i](0<=x[i],y[i]<=10^9),依次表示每个点的坐标。

Output

一个整数,即最小费用。

Sample Input

5
2 2
1 1
4 5
7 1
6 7

Sample Output

2

HINT

Source

鸣谢Claris上传

时间: 2024-09-30 05:13:59

BZOJ 4152: [AMPPZ2014]The Captain( 最短路 )的相关文章

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

循环队列基础知识 1.循环队列需要几个参数来确定 循环队列需要2个参数,front和rear 2.循环队列各个参数的含义 (1)队列初始化时,front和rear值都为零: (2)当队列不为空时,front指向队列的第一个元素,rear指向队列最后一个元素的下一个位置: (3)当队列为空时,front与rear的值相等,但不一定为零: 3.循环队列入队的伪算法 (1)把值存在rear所在的位置: (2)rear=(rear+1)%maxsize ,其中maxsize代表数组的长度: 4.循环队列

bzoj4152[AMPPZ2014]The Captain 最短路

4152: [AMPPZ2014]The Captain Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1517  Solved: 603[Submit][Status][Discuss] Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. Input 第一行包含一个正整数n(2<=n<=200000),表示点数. 接下来n行,每行包含

BZOJ 1922 大陆争霸(最短路)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1922 题意:有向图求1到n的最短路.但是有些点在某些点被遍历之后才能走. 思路:没有限制就是普通的最短路.多了限制再增加一个数组记录被限制的点由于限制因素而最早可被遍历时间.这样每次两个时间的最大值就是这个点可以被遍历的最早时间. int g[N][N],d1[N],d2[N],num[N]; bool a[N][N],visit[N]; int n,m; void Dij() { i

bzoj4144 [AMPPZ2014]Petrol 图论 最短路 并查集

bzoj4144 [AMPPZ2014]Petrol 图论 最短路 并查集 1.这道题我们主要就是要求出距离一个油站的最近的油站 首先我们dijkstra 求出任意一个点到 离他最近的油站的距离 2.然后会发现 如果一条边的两个端点 的最近油站不同的话 那么这条边就会在这两个油站的最短路上 3.然后对于每一条边 我们将他的权值 变为 dis[ u ] + dis[ v ] + e[ i ][ j ] 如果u与v最近油站相同 那么这个无意义 如果不同 那么久表示 u 最近油站 到 v 最近油站的最

Bzoj 4145: [AMPPZ2014]The Prices

Bzoj 4145: [AMPPZ2014]The Prices 状态压缩dp \(f[i][j]\)表示前i个商店 , 状态为j的最小花费. 考虑什么东西也不买和买了东西. 买了东西的话,就要到i地. 然后转移:\(f[i][j] = min(f[i][j] , f[i][j ^ (1 << k - 1)] + c[i][k])\) 不买东西 \(f[i][j] = f[i - 1][j]\) /*header*/ #include <iostream> #include <

Bzoj 4143: [AMPPZ2014]The Lawyer

Bzoj 4143: [AMPPZ2014]The Lawyer 抱歉,水了这一片博客..( ~~ 为了凑出AMPPZ2014.... ~~ 显然记录最小的右端点,和最大的左端点即可. /*header*/ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <cmath> #d

BZOJ 4144: [AMPPZ2014]Petrol

4144: [AMPPZ2014]Petrol Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 457  Solved: 170[Submit][Status][Discuss] Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满. q次询问,每次给出x,y,b,表示出发点是x,终点是y,油量上限为b,且保证x点和y点都是加油站,请回答能否从x走

BZOJ 2662: [BeiJing wc2012]冻结(最短路)

这道题和 BZOJ 2763飞行路线 几乎一模一样..然后飞行路线我是1A,这道题WA了4次,我开始怀疑我的智商了.. -------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #inclu

BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )

最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> #include<iostre