zoukankan      html  css  js  c++  java
  • HDU 5669 线段树优化建图+分层图最短路

    http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=688&pid=1005

    题意:

    题解:

    邀请赛前复习一下板子..

    线段树优化建图+分层图最短路

    在dij里面写松弛会不少一些,如果真的建了11层图,貌似会T

    (都9102年了,hdu还是不支持c11)

    #include <bits/stdc++.h>
    #define endl '
    '
    #define ll long long
    #define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
    #define rep(ii,a,b) for(register int ii=a;ii<=b;++ii)
    #define forn(ii,now) for(register int ii=head[now];ii;ii=e[ii].next)
    using namespace std;
    const int maxn=1e6+10,maxm=2e6+10;
    const ll INF=0x3f3f3f3f3f3f3f3f;
    int casn,n,m,k,q,s,num[maxn];
    class graph{public:
    	struct node{int to,next;ll cost;}e[maxn];
    	int head[maxn],nume;
      inline void add(int a,int b,ll c){
        e[++nume]={b,head[a],c};
        head[a]=nume;
      }
      void init(int n){memset(head,0,(n+1)<<2);nume=1;}
      struct road{
        int now,use;ll dis;
        road(int a,ll b,int c){now=a,dis=b;use=c;}
        bool operator<(const road &rhs)const{return dis>rhs.dis;}
    	};
    	ll dis[maxn][12];priority_queue<road>q;
    	void getdis(int st,int n=maxn-10){
    		memset(dis,0x3f,(sizeof dis[0])*(n+1));q.emplace(st,0,0);
    		memset(dis[1],0,sizeof dis[1]);
    		while(!q.empty()){
    			road t=q.top();q.pop();
    			forn(i,t.now){
    				node ee=e[i];
    				ll cost=t.dis+ee.cost;
    				if(cost<dis[ee.to][t.use]){
    					dis[ee.to][t.use]=cost;
    					q.emplace(ee.to,cost,t.use);
    				}
    				if(t.use<k&&t.dis<dis[ee.to][t.use+1]){
              dis[ee.to][t.use+1]=t.dis;
    					q.emplace(ee.to,t.dis,t.use+1);
    				}
    			}
    		}
    	}
    }g;
    int cnt;
    class segtree{public:
    #define nd  node[now]
    #define ndl node[now<<1]
    #define ndr node[now<<1|1]
        int flag;//1==intree,0==outtree
        struct segnode {
            int l,r,id;
            inline int mid(){return (r+l)>>1;}
            inline int len(){return r-l+1;}
        };
        segnode node[maxn<<2|3];
        vector<int> v;
        void init(int n,int flag){
    			this->flag=flag;
          maketree(1,n);
        }
        void pushup(int now){
            if(!flag){
                g.add(nd.id,ndl.id,0);
                g.add(nd.id,ndr.id,0);
            }else {
                g.add(ndl.id,nd.id,0);
                g.add(ndr.id,nd.id,0);
            }
        }
        void maketree(int s,int t,int now=1){
            nd={s,t,++cnt};
            if(s==t){
                if(flag) g.add(s,nd.id,0);
                else g.add(nd.id,s,0);
                return ;
            }
            maketree(s,nd.mid(),now<<1);
            maketree(nd.mid()+1,t,now<<1|1);
            pushup(now);
        }
        vector<int>  query(int s,int t){v.clear();find(s,t);return v;}
        void find(int s,int t,int now=1){
            if(s<=nd.l&&t>=nd.r) {
                v.emplace_back(nd.id);
                return ;
            }
            if(s<=ndl.r) find(s,t,now<<1);
            if(t>ndl.r) find(s,t,now<<1|1);
        }
    }intree,outree;
    int main() {
      IO;cin>>casn>>n>>m>>k;cnt=n;
      g.init(n*20);
      intree.init(n,1);
      outree.init(n,0);
      rep(i,1,m){
      	int a,b,c,d;ll w;cin>>a>>b>>c>>d>>w;
        vector<int> in=intree.query(a,b),out=outree.query(c,d);
        ++cnt;
        int sz=in.size();
        for(int i=0,p=in[0];i<sz;++i,p=in[i]) g.add(p,cnt,w);
        sz=out.size();
        for(int i=0,p=out[0];i<sz;++i,p=out[i]) g.add(cnt,p,0);
        in=intree.query(c,d),out=outree.query(a,b);
        ++cnt;
        sz=in.size();
        for(int i=0,p=in[0];i<sz;++i,p=in[i]) g.add(p,cnt,w);
        sz=out.size();
        for(int i=0,p=out[0];i<sz;++i,p=out[i]) g.add(cnt,p,0);
      }
      g.getdis(1,cnt);
      ll ans=INF;
      rep(i,0,k) ans=min(ans,g.dis[n][i]);
      if(ans<INF) cout<<ans<<endl;
      else cout<<"CreationAugust is a sb!"<<endl;
    }
    
  • 相关阅读:
    教程:在 Visual Studio 中开始使用 Flask Web 框架
    教程:Visual Studio 中的 Django Web 框架入门
    vs2017下发现解决python运行出现‘No module named "XXX""的解决办法
    《sqlite权威指南》读书笔记 (一)
    SQL Server手工插入标识列
    hdu 3729 I'm Telling the Truth 二分图匹配
    HDU 3065 AC自动机 裸题
    hdu 3720 Arranging Your Team 枚举
    virtualbox 虚拟3台虚拟机搭建hadoop集群
    sqlserver 数据行统计,秒查语句
  • 原文地址:https://www.cnblogs.com/nervendnig/p/10873258.html
Copyright © 2011-2022 走看看