SCOI2005王室联邦(树分块,搜索)

王室联邦

【题意】树分块。求共有多少子树规模在\((B,3B)\)

【解题】dfs 或 bfs,用栈维护。

#include <cstdio>
#include<iostream>
#include <cmath>
#include <cstring>
using namespace std;
const int N = 105000;
int n, B, stk[N], top, bel[N], cap[N], idx, len,head[N];
int ecnt, adj[N], nxt[2*N], go[2*N];
struct node{
   int v,from,w,next,to;
}e[N];
void add(int u, int v){
	  e[++len].next = head[u];
	  head[u] = len;
	  e[len].to = v;
	  e[len].from = u;
}

void dfs(int u, int pre){
    int st = top;
    for(int z = head[u], v; z; z = e[z].next)
    if(v = e[z].to, v != pre){
        dfs(v, u);
        if(top - st >= B){
        cap[++idx] = u;  //省会 
        while(top > st) bel[stk[top--]] = idx;  //各城市所属的省 
        }
    }
    stk[++top] = u;
}

int main(){

    scanf("%d%d",&n,&B);
    for(int i = 1, u, v; i < n; i++)
       scanf("%d%d",&u,&v), add(u, v), add(v, u);
    dfs(1, 0);
    
    while(top) bel[stk[top--]] = idx;  //剩下的那坨都是最后一个省的 
    cout << idx << endl;
     
    for(int i = 1; i <= n; i++)
       printf("%d ",bel[i]);
    puts("");
    for(int i = 1; i <= idx; i++)
       printf("%d ",cap[i]);
    puts("");

    return 0;
}
posted @ 2019-11-07 01:35  QUEKI嶺冬  阅读(142)  评论(0编辑  收藏  举报
/*! Color themes for Google Code Prettify | MIT License | github.com/jmblog/color-themes-for-google-code-prettify */ .pln{color:#4d4d4c}ol.linenums{margin-top:0;margin-bottom:0;color:#8e908c}li.L0,li.L1,li.L2,li.L3,li.L4,li.L5,li.L6,li.L7,li.L8,li.L9{padding-left:1em;background-color:#fff;list-style-type:decimal!important;}@media screen{.str{color:#718c00}.kwd{color:#8959a8}.com{color:#8e908c}.typ{color:#4271ae}.lit{color:#f5871f}.pun{color:#4d4d4c}.opn{color:#4d4d4c}.clo{color:#4d4d4c}.tag{color:#c82829}.atn{color:#f5871f}.atv{color:#3e999f}.dec{color:#f5871f}.var{color:#c82829}.fun{color:#4271ae}} /*下面是我设置背景色,字体大小和字体*/ .cnblogs-markdown code{ background:#fff!important; } .cnblogs_code,.cnblogs_code span,.cnblogs-markdown .hljs{ font-size:16px!important; } .syntaxhighlighter a, .syntaxhighlighter div, .syntaxhighlighter code, .syntaxhighlighter table, .syntaxhighlighter table td, .syntaxhighlighter table tr, .syntaxhighlighter table tbody, .syntaxhighlighter table thead, .syntaxhighlighter table caption, .syntaxhighlighter textarea { font-size: 16px!important; } .cnblogs_code, .cnblogs_code span, .cnblogs-markdown .hljs{ font-family:consolas, "Source Code Pro", monaco, monospace !important; } //以上是代码高亮 /* 文字特效 */