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;
    }
    
  • 相关阅读:
    JS项目快速压缩(windows平台)
    Maven工程的POM继承
    Docker构建一个node镜像
    win10家庭版安装Docker for Windows
    linux,vim和bash命令小册
    vue文档阅读笔记——计算属性和侦听器
    nodejs的jekins部署
    `vue-router`的`History`模式下的项目发布
    花式图表,炫技时刻!PPT技能
    在创业之路上不断创新
  • 原文地址:https://www.cnblogs.com/nervendnig/p/10873258.html
Copyright © 2011-2022 走看看