bzoj4152[AMPPZ2014]The Captain 最短路

4152: [AMPPZ2014]The Captain

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 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行,每行包含两个整数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

按横坐标排序,相邻点建边
按纵坐标排序,相邻点建边
dijkstra可过

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define mp make_pair
 4 #define N 200005
 5 using namespace std;
 6 typedef pair<ll,int>pii;
 7 int n,tot,vis[N],hd[N],d[N];
 8 struct P{int x,y,id;}a[N];
 9 struct edge{int v,w,next;}e[N*10];
10 bool cmp1(P a,P b){return a.x<b.x;}
11 bool cmp2(P a,P b){return a.y<b.y;}
12 void add(int u,int v,int w){
13     e[++tot].v=v;
14     e[tot].next=hd[u];
15     e[tot].w=w;
16     hd[u]=tot;
17 }
18 void adde(int u,int v,int w){add(u,v,w);add(v,u,w);}
19 priority_queue<pii,vector<pii>,greater<pii> >q;
20 void dijkstra(){
21     for(int i=1;i<=n;i++)d[i]=1<<30;
22     d[1]=0;q.push(mp(0,1));
23     while(!q.empty()){
24         pii x=q.top();q.pop();
25         int u=x.second;
26         if(vis[u])continue;vis[u]=1;
27         for(int i=hd[u];i;i=e[i].next){
28             int v=e[i].v;
29             if(vis[v])continue;
30             if(d[v]>d[u]+e[i].w){
31                 d[v]=d[u]+e[i].w;
32                 q.push(mp(d[v],v));
33             }
34         }
35     }
36 }
37
38 int main(){
39     scanf("%d",&n);
40     for(int i=1;i<=n;a[i].id=i,i++)
41     scanf("%d%d",&a[i].x,&a[i].y);
42     sort(a+1,a+1+n,cmp1);
43     for(int i=1;i<n;i++)
44     adde(a[i].id,a[i+1].id,abs(a[i+1].x-a[i].x));
45     sort(a+1,a+1+n,cmp2);
46     for(int i=1;i<n;i++)
47     adde(a[i].id,a[i+1].id,abs(a[i+1].y-a[i].y));
48     dijkstra();printf("%d",d[n]);
49     return 0;
50 }

原文地址:https://www.cnblogs.com/wsy01/p/8366443.html

时间: 2024-10-10 17:33:05

bzoj4152[AMPPZ2014]The Captain 最短路的相关文章

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

先按x排序, 然后只有相邻节点的边才有用, 我们连起来, 再按y排序做相同操作...然后就dijkstra ------------------------------------------------------------------------ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include

BZOJ4152: [AMPPZ2014]The Captain

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

循环队列+堆优化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.循环队列

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

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

[AMPPZ2014] The Captain

问题描述 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. 输入格式 第一行包含一个正整数n(2<=n<=200000),表示点数. 接下来n行,每行包含两个整数x[i],y[i] (0<=x[i],y[i]<=10^9),依次表示每个点的坐标. 输出格式 一个整数,即最小费用. 样例输入 5 2 2 1 1 4 5 7 1 6 7 样例输出 2 解析 首先想到的应该是\(n^2\)连边,但显然

待 题表

题表 达哥终极杂题表Bzoj2839 hdu6021 Codeforces 804DBzoj2248 hdu5575 Codeforces 786CBzoj2013 bzoj2676 Codeforces 803CBzoj2386 bzoj3782 Codeforces 813DBzoj2699 cogs1667 Codeforces 814DBzoj4798 bzoj2064 Codeforces 814EBzoj4639 bzoj3505 Codeforces 815ABzoj4417 bz

【BZOJ】【4152】【AMPZZ2014】The Captain

最短路 题解:http://zyfzyf.is-programmer.com/posts/97953.html 按x坐标排序,相邻点之间连边.满足dist(x1,x3)<=dist(x1,x2)+dist(x2,x3)(因为可以走y) 再按y坐标排序,相邻点之间连边.同上 然而SPFA挂了……写了Dijkstra 1 /************************************************************** 2 Problem: 4152 3 User: Tu

AMPPZ2014

[AMPPZ2014]The Lawyer 记录每天结束的最早的会议以及开始的最晚的会议即可. #include<cstdio> #define N 500010 int n,m,i,d,a[N],b[N],st[21],en[21]; inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&am

BZOJ4152The Captain[DIjkstra]

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