zoukankan      html  css  js  c++  java
  • BZOJ 4152 The Captain

    切比雪夫距离最短路。

    按x,y轴分别排序然后相邻点连边跑最短路。

    spfa会被卡掉。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #define maxv 200500
    #define maxe 805000
    #define inf 999999999999999
    using namespace std;
    struct point
    {
        long long x,y,id;
    }p[maxv];
    struct edge
    {
        long long v,w,nxt;    
    }e[maxe];
    struct status
    {
        long long v,len;
        bool operator < (const status &a) const
        {
            return len>a.len;
        }
    };
    priority_queue <status> q;
    long long n,g[maxv],dis[maxv],nume=0;
    bool vis[maxv];
    bool cmp1(point a,point b)
    {
        return a.x<b.x;
    }
    bool cmp2(point a,point b)
    {
        return a.y<b.y;
    }
    void addedge(long long u,long long v,long long w)
    {
        e[++nume].v=v;
        e[nume].w=w;
        e[nume].nxt=g[u];
        g[u]=nume;
    }
    void dijkstra()
    {
        while (!q.empty())
            q.pop();
        for (int i=2;i<=n;i++)
            dis[i]=inf;
        dis[1]=0;
        status begin;begin.v=1;begin.len=0;q.push(begin);
        while (!q.empty())
        {
            status head=q.top();q.pop();
            long long now=head.v;
            if (dis[now]!=head.len) continue;
            for (long long i=g[now];i;i=e[i].nxt)
            {
                long long v=e[i].v;
                if (dis[v]>dis[now]+e[i].w)
                {
                    dis[v]=dis[now]+e[i].w;
                    status then;then.v=v;then.len=dis[v];
                    q.push(then);
                }
            }
        }
    }
    int main()
    {
        scanf("%lld",&n);
        for (long long i=1;i<=n;i++)
        {
            scanf("%lld%lld",&p[i].x,&p[i].y);
            p[i].id=i;
        }
        sort(p+1,p+n+1,cmp1);
        for (long long i=1;i<=n-1;i++)
        {
            addedge(p[i].id,p[i+1].id,p[i+1].x-p[i].x);
            addedge(p[i+1].id,p[i].id,p[i+1].x-p[i].x);
        }
        sort(p+1,p+n+1,cmp2);
        for (long long i=1;i<=n-1;i++)
        {
            addedge(p[i].id,p[i+1].id,p[i+1].y-p[i].y);
            addedge(p[i+1].id,p[i].id,p[i+1].y-p[i].y);
        }
        dijkstra();
        printf("%lld
    ",dis[n]);
        return 0;
    }
  • 相关阅读:
    storm学习途径
    Spark中的RDD操作简介
    【转】Hadoop web页面的授权设定
    源码安装ipython,并在ipython中整合spark
    Spark调优
    在Java中调用C
    查看Mysql表空间大小 优化空间
    update A inner join
    kibana 汉化
    xcode-select --install不能下载该软件的解决办法
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5365307.html
Copyright © 2011-2022 走看看