zoukankan      html  css  js  c++  java
  • P2325 [SCOI2005]王室联邦

    思路

    利用了树上莫队的分块方式,保证每个块的大小都(ge)B且$le$3B,然后证明略过
    仅叙述一下算法的过程

    使用一个栈,依次dfs这个点的每个子树,如果发现新增的节点数大于等于B,就分出新的一块,
    最后把剩下的节点塞进最后一个块里

    分块的代码

    void dfs(int u,int f){
        int t=S.size();
        for(int i=fir[u];i;i=nxt[i]){
            if(v[i]==f)
                continue;
            dfs(v[i],u);
            if(S.size()-t>=B){
                ++block_cnt;
                core[block_cnt]=u;
                while(S.size()>t){
                    belong[S.top()]=block_cnt;
                    S.pop();
                }
            }
        }
        S.push(u);
    }
    

    AC代码

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <stack>
    using namespace std;
    stack<int> S;
    int v[5000],fir[5000],nxt[5000],cnt,B,n,core[5000],block_cnt=0,belong[5000];
    void addedge(int ui,int vi){
        ++cnt;
        v[cnt]=vi;
        nxt[cnt]=fir[ui];
        fir[ui]=cnt;
    }
    void dfs(int u,int f){
        int t=S.size();
        for(int i=fir[u];i;i=nxt[i]){
            if(v[i]==f)
                continue;
            dfs(v[i],u);
            if(S.size()-t>=B){
                ++block_cnt;
                core[block_cnt]=u;
                while(S.size()>t){
                    belong[S.top()]=block_cnt;
                    S.pop();
                }
            }
        }
        S.push(u);
    }
    int main(){
        scanf("%d %d",&n,&B);
        for(int i=1;i<n;i++){
            int a,b;
            scanf("%d %d",&a,&b);
            addedge(a,b);
            addedge(b,a);
        }
        dfs(1,0);
        while(!S.empty()){
            belong[S.top()]=block_cnt;
            S.pop();
        }
        printf("%d
    ",block_cnt);
        for(int i=1;i<=n;i++)
            printf("%d ",belong[i]);
        printf("
    ");
        for(int i=1;i<=block_cnt;i++)
            printf("%d ",core[i]);
        printf("
    ");
        return 0;
    }
    
  • 相关阅读:
    AI编辑SVG格式的相关问题
    HTML里的id等属性命名需要注意
    canvas绘图动画细节
    触控获取坐标判断滑动方向
    CSS3卡片旋转效果
    使用CURL下载远程文件保存到服务器
    微信JS-SDK应用DEMO
    布局转换:文档流->绝对定位
    ThinkPHP缓存微信公众号access_token
    JAVA JSP笔记
  • 原文地址:https://www.cnblogs.com/dreagonm/p/10817707.html
Copyright © 2011-2022 走看看