zoukankan      html  css  js  c++  java
  • [dij] Codeforces Round #675 (Div. 2) D. Returning Home

    注意搜到终点就不要搜了,不然会TLE

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define rep(i,a,b) for(ll i=a;i<=b;i++)
    #define per(i,a,b) for(ll i=a;i>=b;i--)
    #define go(i,a) for(ll i=head[a];i;i=e[i].to)
    #define endl '
    '
    #define mem(x) memset(x,0,sizeof(x))
    const ll amn=1e6+5,inf=1e18;
    char a[amn];
    ll n,m,k;
    
    ll head[amn],etot=0;
    struct eg{
        ll to,u,v,w;
        eg(){}
        eg(ll to,ll u,ll v,ll w):to(to),u(u),v(v),w(w){}
    }e[amn<<1];
    void add(ll u,ll v,ll w){
        e[++etot]=eg(head[u],u,v,w);
        head[u]=etot;
        e[++etot]=eg(head[v],v,u,w);
        head[v]=etot;
    }
    
    struct nd{
        ll x,y,i;
        nd(){}
        nd(ll x,ll y,ll i):x(x),y(y),i(i){}
    }np[amn];
    
    bool cmp1(nd a,nd b){return a.x<b.x;}
    bool cmp2(nd a,nd b){return a.y<b.y;}
    ll gd(ll a,ll b){return abs(a-b);}
    ll ans=0;
    
    struct node{
        ll i,d;
        node(){}
        node(ll i,ll d):i(i),d(d){}
        friend bool operator < (node a,node b){
            return a.d>b.d;
        }
    };
    ll vis[amn];
    ll dis[amn];
    void dij(ll st){
        rep(i,0,m+1){
            vis[i]=0;
            dis[i]=inf;
        }
        dis[st]=0;
    
        priority_queue<node> q;
        while(q.size())q.pop();
        q.push(node(st,0));
    
        while(q.size()){
            node x=q.top();q.pop();
            ll u=x.i,d=x.d;
            if(vis[u])continue;
    
            if(u==m+1)break;    ///因为是优先队列,所以搜到终点就不用搜了,如果继续搜就会在TEST4那TLE
    
            vis[u]=1;
            go(i,u){
                ll v=e[i].v,w=e[i].w;
                if(!vis[v]&&d+w<dis[v]){
                    dis[v]=d+w;
                    q.push(node(v,dis[v]));
                }
            }
        }
    }
    
    int main(){
    //    ios::sync_with_stdio(0);
        ll T=1;
    //    cin>>T;
        while(T--){
            scanf("%lld%lld",&n,&m);
            ll sx,sy,fx,fy;
            scanf("%lld%lld%lld%lld",&sx,&sy,&fx,&fy);
            rep(i,1,m){
                scanf("%lld%lld",&np[i].x,&np[i].y);
                np[i].i=i;
            }
    
            add(0,m+1,gd(sx,fx)+gd(sy,fy));
            rep(i,1,m){
                add(0,i,min(gd(sx,np[i].x),gd(sy,np[i].y)));
                add(i,m+1,gd(fx,np[i].x)+gd(fy,np[i].y));
            }
    
            sort(np+1,np+1+m,cmp1);
            rep(i,2,m){
                add(np[i-1].i,np[i].i,gd(np[i-1].x,np[i].x));
            }
            sort(np+1,np+1+m,cmp2);
            rep(i,2,m){
                add(np[i-1].i,np[i].i,gd(np[i-1].y,np[i].y));
            }
    
    //        rep(i,1,etot){
    //            cout<<e[i].to<<' '<<e[i].u<<' '<<e[i].v<<' '<<e[i].w<<endl;
    //        }
    
            ans=1e18;
            dij(0);
    //        rep(i,0,m+1)cout<<i<<' '<<dis[i]<<endl;
            printf("%lld
    ",dis[m+1]);
        }
    }
  • 相关阅读:
    python 编码与解码
    python 写文件
    python 文件读写
    python 异常处理
    python 断言
    C++的可移植性和跨平台开发
    Python中subprocess学习
    Python 的web自动化测试
    CookieJar和HTTPCookieProcessor
    python3爬虫
  • 原文地址:https://www.cnblogs.com/Railgun000/p/13815422.html
Copyright © 2011-2022 走看看