【AMPPZ2014】【BZOJ4152】The Captain
2015-11-24 10:13
453 查看
Description
给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用。
Input
第一行包含一个正整数n(2<=n<=200000),表示点数。
接下来n行,每行包含两个整数x[i],yi,依次表示每个点的坐标。
Output
一个整数,即最小费用。
Sample Input
5
2 2
1 1
4 5
7 1
6 7
Sample Output
2
HINT
Source
鸣谢Claris上传
感觉自己也就能欺负一下AMPPZ的题
其实是被AMPPZ的题欺负还差不多
可以考虑贪心的建图然后最短路
x坐标排序,然后相邻点连边
y坐标排序,连边
注意连边一定要连双向边否则会WA
给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用。
Input
第一行包含一个正整数n(2<=n<=200000),表示点数。
接下来n行,每行包含两个整数x[i],yi,依次表示每个点的坐标。
Output
一个整数,即最小费用。
Sample Input
5
2 2
1 1
4 5
7 1
6 7
Sample Output
2
HINT
Source
鸣谢Claris上传
感觉自己也就能欺负一下AMPPZ的题
其实是被AMPPZ的题欺负还差不多
可以考虑贪心的建图然后最短路
x坐标排序,然后相邻点连边
y坐标排序,连边
注意连边一定要连双向边否则会WA
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #define MAXN 200010 #define GET (ch>='0'&&ch<='9') #define MAXINT 0x7fffffff using namespace std; int n,top; int dis[MAXN]; bool vis[MAXN]; struct Node {int x,y,id;}s[MAXN]; bool cmp1(Node a,Node b) {return a.x<b.x;} bool cmp2(Node a,Node b) {return a.y<b.y;} struct node { int x,dis; bool operator <(const node& a)const {return dis>a.dis;} }; struct edge { int to,w; edge *next; }e[MAXN<<2],*prev[MAXN]; void insert(int u,int v,int w) {e[++top].to=v;e[top].next=prev[u];prev[u]=&e[top];e[top].w=w;} void in(int &x) { char ch=getchar();x=0; while (!GET) ch=getchar(); while (GET) x=x*10+ch-'0',ch=getchar(); } int Abs(int x) {return x>0?x:-x;} void dijkstra(int s) { priority_queue<node> heap; for (int i=1;i<=n;i++) dis[i]=MAXINT; dis[s]=0;heap.push((node){s,0}); while (!heap.empty()) { int x=heap.top().x;heap.pop(); if (vis[x]) continue;vis[x]=1; for (edge *i=prev[x];i;i=i->next) if (dis[i->to]>dis[x]+i->w) dis[i->to]=dis[x]+i->w,heap.push((node){i->to,dis[i->to]}); } } int main() { in(n); for (int i=1;i<=n;i++) in(s[i].x),in(s[i].y),s[i].id=i; sort(s+1,s+n+1,cmp1); for (int i=1;i<n;i++) if ((s[i+1].x-s[i].x)<=Abs(s[i+1].y-s[i].y)) insert(s[i].id,s[i+1].id,s[i+1].x-s[i].x),insert(s[i+1].id,s[i].id,s[i+1].x-s[i].x); sort(s+1,s+n+1,cmp2); for (int i=1;i<n;i++) if ((s[i+1].y-s[i].y)<=Abs(s[i+1].x-s[i].x)) insert(s[i].id,s[i+1].id,s[i+1].y-s[i].y),insert(s[i+1].id,s[i].id,s[i+1].y-s[i].y); dijkstra(1);printf("%d\n",dis ); }
相关文章推荐
- Poj2638 网络流+最短路+二分答案
- Aizu1311 分层图最短路 (...大概)
- 最短路径 -- spfa
- 单源最短路深度分析
- hdu5137最短路
- Dijkstra求最短路与次短路
- 2014西安邀请赛部分题解
- 2014 西安邀请赛状压DP
- 2013长沙邀请赛Travel in time
- 最短路dij——POJ 2387 Til the Cows Come Home题解
- 带负权的最短路bellman_ford——POJ 3259 Wormholes题解
- hdu 2544 最短路(简单的Floyd)
- hdu 3790 最短路径问题 (dijkstra算法+memset()用法)
- poj 2253 Frogger(dijkstra)
- hdu 2544 最短路 (Bellman_Ford算法)
- hdu 2690 Choose the best route (bellman_ford)
- hdu 1596 find the safest road(spfa算法)
- [BZOJ1266][AHOI2006][最短路][最小割]上学路线
- 最短路(Dijstra) 畅通工程续
- 最短路(Dijstra) 一个人的旅行