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 }

 

posted @ 2018-01-27 16:38  _wsy  阅读(187)  评论(0编辑  收藏  举报