BZOJ 4152: [AMPPZ2014]The Captain 题解 【贪心】【SPFA】
2017-07-04 16:15
429 查看
【题目描述】
给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用。
【题解】
作为一个不久前才刷了几道图论题的人,这道题一看就给人一个想要用SPFA的快感。
我们不难发现,如果有一个点P在M,N两个点之间,从M到N得代价一定大于从P到M再从P到N得代价。换言之,我们的边应该建在横纵坐标相邻的点之间。
为此目的,我们把点们按照横坐标从小到大排序,再把点们按照纵坐标从小到大排序。然后直接按排好的顺序两辆排序。
不幸的是,这个题恶意卡SPFA。所以除非你开堆优化或迪杰斯特拉是过不了的。
代码如下:
给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用。
【题解】
作为一个不久前才刷了几道图论题的人,这道题一看就给人一个想要用SPFA的快感。
我们不难发现,如果有一个点P在M,N两个点之间,从M到N得代价一定大于从P到M再从P到N得代价。换言之,我们的边应该建在横纵坐标相邻的点之间。
为此目的,我们把点们按照横坐标从小到大排序,再把点们按照纵坐标从小到大排序。然后直接按排好的顺序两辆排序。
不幸的是,这个题恶意卡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 ; 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;} struct edge { int u,v; long long w; int next; edge(){next=-1;} }ed[4*N]; 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; }
相关文章推荐
- 循环队列+堆优化dijkstra最短路 BZOJ 4152: [AMPPZ2014]The Captain
- BZOJ 4152: [AMPPZ2014]The Captain 分层图最短路
- bzoj 4152: [AMPPZ2014]The Captain
- BZOJ 4152: [AMPPZ2014]The Captain( 最短路 )
- BZOJ 4152: [AMPPZ2014]The Captain(最短路)
- 4152: [AMPPZ2014]The Captain
- 4152: [AMPPZ2014]The Captain
- bzoj 4144: [AMPPZ2014]Petrol spfa+最小生成树
- 4152: [AMPPZ2014]The Captain
- BZOJ 4144: [AMPPZ2014]Petrol 最短路+最小生成树+倍增
- BZOJ3670 NOI2014 动物园 题解&代码
- bzoj 4145: [AMPPZ2014]The Prices 状压dp
- BZOJ 4144: [AMPPZ2014]Petrol
- BZOJ1001(BeiJing2006)[狼抓兔子]题解--最小割&spfa
- BZOJ 4145: [AMPPZ2014]The Prices( 状压dp + 01背包 )
- BZOJ 4143: [AMPPZ2014]The Lawyer( sort )
- 【BZOJ】4147: [AMPPZ2014]Euclidean Nim
- 【BZOJ 4148】 4148: [AMPPZ2014]Pillars (乱搞)
- BZOJ 4152: [AMPPZ2014]The Captain
- BZOJ 4152 [AMPPZ2014]The Captain 最短路题解