zoukankan      html  css  js  c++  java
  • 数据结构:树上分块

    把所谓的树结构分成一块儿一块儿的?

    当然这种数据结构并不强力,如果想要借助其分块儿的思想来解决问题,肯定有更好的其它的算法来替代它

    所以,这里只是铺一个知识点探探路而已

    典型例题BZOJ1086

    题意就是把树分块儿

    但是为何样例是错的?

    其实递归的学问还是很大的

     1 #include<cstdio>
     2 const int maxn=1005;
     3 const int maxm=2005;
     4 int n,B,cnt,top,pro;
     5 int g[maxn],q[maxn],cap[maxn],belong[maxn],size[maxn];
     6 struct Data
     7 {
     8     int t,next;
     9 }e[maxm];
    10 inline int read()
    11 {
    12     int x=0,f=1;char ch=getchar();
    13     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    14     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    15     return x*f;
    16 }
    17 void insert(int u,int v)
    18 {
    19     e[++cnt].t=v;e[cnt].next=g[u];g[u]=cnt;
    20     e[++cnt].t=u;e[cnt].next=g[v];g[v]=cnt;
    21 }
    22 void dfs(int x,int fa)
    23 {
    24     q[++top]=x;
    25     for(int tmp=g[x];tmp;tmp=e[tmp].next)
    26     {
    27         if(e[tmp].t!=fa)
    28         {
    29             dfs(e[tmp].t,x);
    30             size[x]+=size[e[tmp].t];  //退栈时更新size 
    31             if(size[x]>=B)  //如果可以分块儿了 
    32             {
    33                 size[x]=0;
    34                 cap[++pro]=x;  //当前x作为省会 
    35                 while(q[top]!=x) belong[q[top--]]=pro;  //弹出来带上连通分量标记 
    36             }
    37         }
    38     }
    39     size[x]++;//自己 
    40 }
    41 void paint(int x,int fa,int c)
    42 {
    43     if(belong[x]) c=belong[x];
    44     else belong[x]=c;
    45     for(int tmp=g[x];tmp;tmp=e[tmp].next)
    46         if(e[tmp].t!=fa) paint(e[tmp].t,x,c);
    47 }
    48 int main()
    49 {
    50     int u,v;
    51     n=read();B=read();
    52     if(n<B) {puts("0");return 0;}
    53     for(int i=1;i<n;i++)
    54     {
    55         u=read();v=read();
    56         insert(u,v);
    57     }
    58     dfs(1,0);  //子树大小超过B直接划省,根为省会 
    59     if(pro==0) cap[++pro]=1;
    60     paint(1,0,pro); 
    61     printf("%d
    ",pro);
    62     for(int i=1;i<=n;i++) printf("%d ",belong[i]);
    63     puts("");
    64     for(int i=1;i<=pro;i++) printf("%d ",cap[i]);
    65     puts("");
    66     return 0;
    67 } 
  • 相关阅读:
    《C语言课程设计与游戏开发实践课程》67章总结
    祖玛(Zuma)
    .net 实现微信公众平台的主动推送信息
    关于ASP与C#的感悟
    不同方面高手的地址。
    ASP中关于全局页面的作用 asax文件
    学习C#,开始了我的第一个进程。
    江苏立方网络科技有限公司招聘PHP工程师
    网上看到的ArcEngine控制地图显示范围的好方法(记下)
    3DS文件结构
  • 原文地址:https://www.cnblogs.com/aininot260/p/9531964.html
Copyright © 2011-2022 走看看