码迷,mamicode.com
首页 > 其他好文 > 详细

【BZOJ】【1086】 【SCOI2005】王室联邦

时间:2015-01-25 12:21:25      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:

树分块

  orz vfk && PoPoQQQ

  http://vfleaking.blog.163.com/blog/static/174807634201231684436977/
  http://blog.csdn.net/popoqqq/article/details/42772237

  这题是要把树分成一块一块的……(感觉好像不是原来理解的树分块处理操作啊……)

  每块大小B<= size <=3B ,一种简单粗暴的想法就是dfs,每找到B个就分一块,但是这样连通性不能保证(一颗子树的下半截和另一棵子树的上半截组成一块)。所以我们就想:能不能从底部往上组块,每棵子树较深的部分自己成块,然后靠近根的部分组成一个大块

技术分享

  这样就可以保证连通性和块大小不会超了,最后dfs结束后肯定还会有剩余的未组成块的节点,把它们归到最后一个块就可以了。证明看vfk博客就行……

  至于实现这个“等待序列”,用的是PoPoQQQ的方法:用栈来实现,对当前节点x,它的等待序列就是bottom--top(bottom初始化为top,然后再向栈里加的元素就是他的儿子)……呃……这个自己手画一个简单的就能理解了吧……?或者脑补一下……嗯

技术分享
 1 /**************************************************************
 2     Problem: 1086
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:12 ms
 7     Memory:1320 kb
 8 ****************************************************************/
 9  
10 //BZOJ 1086
11 #include<cstdio>
12 #include<cstring>
13 #include<cstdlib>
14 #include<iostream>
15 #include<algorithm>
16 #define rep(i,n) for(int i=0;i<n;++i)
17 #define F(i,j,n) for(int i=j;i<=n;++i)
18 #define D(i,j,n) for(int i=j;i>=n;--i)
19 using namespace std;
20 void read(int &v){
21     v=0; int sign=1; char ch=getchar();
22     while(ch<0||ch>9){ if (ch==-) sign=-1; ch=getchar();}
23     while(ch>=0&&ch<=9){ v=v*10+ch-0; ch=getchar();}
24     v*=sign;
25 }
26 /******************tamplate*********************/
27 const int N=2015;
28 int head[N],to[N],next[N],cnt;
29 void add(int x,int y){
30     to[++cnt]=y; next[cnt]=head[x]; head[x]=cnt;
31     to[++cnt]=x; next[cnt]=head[y]; head[y]=cnt;
32 }
33 /********************edge***********************/
34 int n,B,K;
35 int st[N],top;
36 int belong[N],root[N],tot;
37 void dfs(int x,int fa){
38     int bottom=top;
39     for(int i=head[x];i;i=next[i])
40         if (to[i]!=fa){
41             dfs(to[i],x);
42             if (top-bottom>=B){
43                 root[++tot]=x;
44                 while(top!=bottom)
45                     belong[st[top--]]=tot;
46             }
47         }
48     st[++top]=x;
49 }
50  
51 int main(){
52     read(n); read(B);
53     int x,y;
54     F(i,2,n){
55         read(x); read(y);
56         add(x,y);
57     }
58     dfs(1,0);
59     while(top) belong[st[top--]]=tot;
60     printf("%d\n",tot);
61     F(i,1,n) printf("%d ",belong[i]);
62     printf("\n");
63     F(i,1,tot) printf("%d ",root[i]);
64     return 0;
65 }
View Code

 

【BZOJ】【1086】 【SCOI2005】王室联邦

标签:

原文地址:http://www.cnblogs.com/Tunix/p/4247955.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!