zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    SecureCRT乱码问题简单的解决办法
    安家博客园,开始java web 之旅
    Java Service Wrapper使用心得
    vsftp折腾
    mysql更改数据库表名称和svnerve启动版本库命令、执行jar命令
    Linux 命令积累2
    二进制与十进制的转换
    java Map代替List在for循环中的应用
    Optional 的应用
    java Date、java.sql.Date、localTime、SimpleDateFormat的格式及应用
  • 原文地址:https://www.cnblogs.com/wsy01/p/8366443.html
Copyright © 2011-2022 走看看