bzoj1086王室联邦

Posted zcysky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj1086王室联邦相关的知识,希望对你有一定的参考价值。

我以为树分块什么的必有高论,结果居然是个暴力……

方法也很简单,我看下每个节点dfs的时候是否已经大于k个,大于的话我就新开一块。

注意dfs的时候当前节点不能放进子树的块中。

 1 #include<bits/stdc++.h>
 2 #define N 100010
 3 using namespace std;
 4 struct Edge{int u,v,next;}G[2*N];
 5 int n,B,top,tot,head[N<<2],cnt,rt[N],block[N],q[N];
 6 inline void addedge(int u,int v){
 7     G[++tot].u=u;G[tot].v=v;G[tot].next=head[u];head[u]=tot;
 8     G[++tot].u=v;G[tot].v=u;G[tot].next=head[v];head[v]=tot;
 9 }
10 void dfs(int u,int f){
11     int last=top;
12     for(int i=head[u];i;i=G[i].next){
13         int v=G[i].v;if(v==f)continue;
14         dfs(v,u);
15         if(top-last>=B){
16             block[++cnt]=u;
17             for(;top>last;top--)rt[q[top]]=cnt;
18         }
19     }
20     q[++top]=u;
21 }
22 inline int read(){
23     int f=1,x=0;char ch;
24     do{ch=getchar();if(ch==-)f=-1;}while(ch<0||ch>9);
25     do{x=x*10+ch-0;ch=getchar();}while(ch>=0&&ch<=9);
26     return f*x;
27 }
28 int main(){
29     n=read();B=read();
30     for(int i=1;i<n;i++){
31         int x=read(),y=read();
32         addedge(x,y);
33     }
34     dfs(1,0);
35     while(top)rt[q[top--]]=cnt;
36     printf("%d\n",cnt);
37     for(int i=1;i<=n;i++)printf("%d ",rt[i]);puts("");
38     for(int i=1;i<=cnt;i++)printf("%d ",block[i]);puts("");
39     return 0;
40 }

 

以上是关于bzoj1086王室联邦的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1086 Scoi2005 王室联邦

[bzoj 1086][SCOI2005]王室联邦

[BZOJ1086][SCOI2005]王室联邦

BZOJ 1086 王室联邦

Bzoj1086 [SCOI2005]王室联邦

BZOJ1086:[SCOI2005]王室联邦——题解