BZOJ 4152 最短路(SPFA) 解题报告
2017-07-04 16:52
309 查看
4152: [AMPPZ2014]The Captain
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
【解题报告】
首先观察 一下题中距离的定义。
我们轻易地发现A到C的距离显然是A->B->C而非A->C。
所以说我们得出,最近的边只能是相邻的边(也就是说连边的过程中不能跨过别的点)。
所以说我们把所有的点先按x坐标排序,依次连接起来,y坐标同理。
然后求最短路。
这个时候就有一个坑点,直接用SPFA的话会被卡掉,这个时候可以用Dijkstra,当然我用的是堆优化SPFA也过了。
是不是很简单(划掉)
代码如下:
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
【解题报告】
首先观察 一下题中距离的定义。
我们轻易地发现A到C的距离显然是A->B->C而非A->C。
所以说我们得出,最近的边只能是相邻的边(也就是说连边的过程中不能跨过别的点)。
所以说我们把所有的点先按x坐标排序,依次连接起来,y坐标同理。
然后求最短路。
这个时候就有一个坑点,直接用SPFA的话会被卡掉,这个时候可以用Dijkstra,当然我用的是堆优化SPFA也过了。
是不是很简单(划掉)
代码如下:
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; #define N 200010 #define inf 0x3f3f3f3f #define pa pair<long long,int> using namespace std; struct Node { int x,y,id; }a ; struct edge { int u,v; long long w; int next; edge(){next=-1;} }ed[4*N]; int head ; long long dis ; int n,num; bool vis ; priority_queue<pa,vector<pa>,greater<pa> > q; bool cmp_x(Node x,Node y) {return x.x<y.x;} bool cmp_y(Node x,Node y) {return x.y<y.y;} void build(int u,int v,int w) { num++; ed[num].w=w; ed[num].v=v; ed[num].next=head[u]; head[u]=num; } void SPFA() { memset(vis,0,sizeof(vis)); for(int i=1;i<=n;++i)dis[i]=inf; dis[1]=0; q.push(make_pair(0,1)); while(!q.empty()) { int u=q.top().second; q.pop(); if(vis[u])continue; vis[u]=1; for(int i=head[u];i!=-1;i=ed[i].next) { int v=ed[i].v; if(dis[v]>dis[u]+ed[i].w) { dis[v]=dis[u]+ed[i].w; q.push(make_pair(dis[v],v)); } } } } int main() { memset(head,-1,sizeof(head)); scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d%d",&a[i].x,&a[i].y); a[i].id=i; } sort(a+1,a+n+1,cmp_x); for(int i=1;i<n;++i) { build(a[i].id,a[i+1].id,a[i+1].x-a[i].x), build(a[i+1].id,a[i].id,a[i+1].x-a[i].x); } sort(a+1,a+n+1,cmp_y); for(int i=1;i<n;++i) { build(a[i].id,a[i+1].id,a[i+1].y-a[i].y), build(a[i+1].id,a[i].id,a[i+1].y-a[i].y); } SPFA(); printf("%lld\n",dis ); return 0; }
相关文章推荐
- BZOJ 2118 数论+最短路(SPFA) 解题报告
- hdu 2544 最短路 spfa 解题报告
- BZOJ4720 [Noip2016]换教室 解题报告【SPFA】【期望DP】
- BZOJ 4720 [Noip 2016] 期望DP+最短路 解题报告
- bzoj 4152 最短路SPFA
- 洛谷 2737 麦香牛块 最短路SPFA? 解题报告
- BZOJ 1003 DP+最短路 解题报告
- BZOJ 4152 状压DP 解题报告
- POJ1724 ROADS 解题报告【最短路/SPFA】
- CodeVS1077 多源最短路 解题报告【SPFA】
- BZOJ 4152 博弈论 解题报告
- POJ1062 昂贵的聘礼 解题报告【最短路/SPFA】
- poj 3255 Roadblocks 次短路 spfa 解题报告
- 最短路spfaPOJInvitation Cardsj解题报告
- poj 2449 Remmarguts' Date 第k短路 A*+spfa 解题报告
- BZOJ 1097 [POI 2007] SPFA+状压DP 解题报告
- HDU6166 Senior Pan 解题报告【图论】【SPFA最短路】【随机】
- LuoguP1144 最短路计数 解题报告【SPFA/BFS】
- BZOJ 1589 [Usaco2008 Dec] Tarjan缩点+记忆化搜索 解题报告
- bzoj 3524 主席树 解题报告