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

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

时间:2019-11-07 09:19:33      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:i++   string   namespace   nod   out   turn   cpp   main   end   

王室联邦

【题意】树分块。求共有多少子树规模在\((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;
}

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

标签:i++   string   namespace   nod   out   turn   cpp   main   end   

原文地址:https://www.cnblogs.com/phemiku/p/11809727.html

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