zoukankan      html  css  js  c++  java
  • 非递归的树链剖分

    int son[maxn],num[maxn],fa[maxn],top[maxn],p[maxn],fp[maxn],pos,depth[maxn];
    vector<int>F[maxn];
    int D[maxn],TOPD[maxn];
    int NU[maxn];
    int IN[maxn];
    void dfs(){
        memset(NU,0,sizeof(NU));
        memset(IN,0,sizeof(IN));
        int cnt=0;
        IN[1]=0;
        D[cnt++]=1;
        depth[1]=0;fa[1]=0;
        son[1]=-1;
        num[1]=1;
        while(cnt>=1){
             int cur=D[cnt-1];
            for(int &i=NU[cur]; i<F[cur].size(); i++ ){
                int to=F[cur][i];
                if(to==fa[cur]) {
                  continue;
                }
                if(IN[to]){
                 num[cur]+=num[to];
                 if( son[ cur ] == -1 || num[ son[cur] ]< num[to] ) son[cur]=to;
                 continue;
                }
                fa[to]=cur;
                IN[to]=1;
                depth[to]=depth[ cur  ]+1;
                son[to]=-1;
                num[to]=1;
                D[cnt++]=to;
                break;
            }
            if(NU[cur]==F[cur].size())cnt--;
        }
    }
    int BU[maxn];
    void finde(){
        memset(NU,0,sizeof(NU));
        memset(BU,0,sizeof(BU));
        memset(IN,0,sizeof(IN));
        int cnt=0;
        IN[1]=0;
        D[cnt]=1;TOPD[cnt++]=1;
        top[1]=1;pos++;p[1]=pos;fp[pos]=1;
        while(cnt>=1){
             int cur=D[cnt-1];
             if(BU[cur]||son[cur]==-1)
              {
                for(int &i=NU[cur]; i<F[cur].size(); i++ ){
                 int to=F[cur][i];
                 if(to==fa[cur]||to==son[cur]||IN[to])continue;
                 IN[to]=1;
                 top[to]=to;
                 pos++;
                 p[to]=pos;
                 fp[pos]=to;
                 D[cnt]=to; TOPD[cnt++]=to; break;
               }
            }else{
              BU[cur]=1;
              int to = son[cur];
              top[to]=TOPD[cnt-1];
              pos++;
              p[to]=pos;
              fp[pos]=to;
              D[cnt]=to;TOPD[cnt]=TOPD[cnt-1];cnt++;
            }
            if(NU[cur]==F[cur].size())cnt--;
        }
    
    
    
    }

     邻接表形式

    int son[maxn],num[maxn],fa[maxn],top[maxn],p[maxn],fp[maxn],pos,depth[maxn],val[maxn];
    int H[maxn],nx[maxn*2],to[maxn*2],numofE;
    int D[maxn],TOPD[maxn];
    int NU[maxn];
    int IN[maxn];
    void dfs(int n){
        for(int i=0;i<=n; i++)
            NU[i]=H[i];
        memset(IN,0,sizeof(IN));
        int cnt=0;
        IN[1]=0;
        D[cnt++]=1;
        depth[1]=0;fa[1]=0;
        son[1]=-1;
        num[1]=1;
        while(cnt>=1){
             int cur=D[cnt-1];
            for(int &i=NU[cur]; i; i=nx[i] ){
                int tto=to[i];
                if(tto==fa[cur]) {
                  continue;
                }
                if(IN[tto]){
                 num[cur]+=num[tto];
                 if( son[ cur ] == -1 || num[ son[cur] ]< num[tto] ) son[cur]=tto;
                 continue;
                }
                fa[tto]=cur;
                IN[tto]=1;
                depth[tto]=depth[ cur  ]+1;
                son[tto]=-1;
                num[tto]=1;
                D[cnt++]=tto;
                break;
            }
            if(NU[cur]==0)cnt--;
        }
    }
    void finde(int n){
        for(int i=0;i<=n;i++)
            NU[i]=H[i];
        memset(BU,0,sizeof(BU));
        memset(IN,0,sizeof(IN));
        int cnt=0;
        IN[1]=0;
        D[cnt]=1;TOPD[cnt++]=1;
        top[1]=1;pos++;p[1]=pos;fp[pos]=1;
        while(cnt>=1){
             int cur=D[cnt-1];
             if(BU[cur]||son[cur]==-1)
              {
                for(int &i=NU[cur]; i; i=nx[i] ){
                 int tto=to[i];
                 if(tto==fa[cur]||tto==son[cur]||IN[tto])continue;
                 IN[tto]=1;
                 top[tto]=tto;
                 pos++;
                 p[tto]=pos;
                 fp[pos]=tto;
                 D[cnt]=tto; TOPD[cnt++]=tto; break;
               }
            }else{
              BU[cur]=1;
              int tto = son[cur];
              top[tto]=TOPD[cnt-1];
              pos++;
              p[tto]=pos;
              fp[pos]=tto;
              D[cnt]=tto;TOPD[cnt]=TOPD[cnt-1];cnt++;
            }
            if(NU[cur]==0)cnt--;
        }
    }
  • 相关阅读:
    端口服务
    系统设计的主要原则是什么?
    Dynamics CRM2015 Custom Code Validation Tool工具的使用
    CONFIGURE ADFS 3.0 WITH SHAREPOINT 2013
    Sharepoint Solution Gallery Active Solution时激活按钮灰色不可用的解决方法
    Dynamics CRM 2015Online Update1 new feature之 插件跟踪日志
    Dynamics CRM2013/2015 Plugin注册工具Register New Assembly时无法看到注册按钮的解决办法
    Dynamics CRM 2015 站点地图公告配置实体显示名称的变更
    Dynamics CRM 2015 Online Update1 UI界面的更新变化
    SQL Server2012 AlwaysOn 无法将数据库联接到可用性组 针对主副本的连接未处于活动状态
  • 原文地址:https://www.cnblogs.com/Opaser/p/4852173.html
Copyright © 2011-2022 走看看