SCOI 2005 王室聯邦 樹上分塊?

2021-07-24 12:36:28 字數 1892 閱讀 9599

在wzh大神(ps:我是渣渣wzh)的部落格看見的乙個分塊題目,剛好要複習分塊,於是我就研究了一下樹上分塊,恩,這個題目的要求和樹上分塊差不多。沒什麼就是原來的size變成題目規定的b了,然後這就變成了分塊的模板題目。

bzoj

大神wzh的部落格orzwzh

description

「餘」人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成

員來管理。他的國家有n個城市,編號為1..n。一些城市之間有道路相連,任意兩個不同的城市之間有且僅有一條

直接或間接的道路。為了防止管理太過分散,每個省至少要有b個城市,為了能有效的管理,每個省最多只有3b個

城市。每個省必須有乙個省會,這個省會可以位於省內,也可以在該省外。但是該省的任意乙個城市到達省會所經

過的道路上的城市(除了最後乙個城市,即該省省會)都必須屬於該省。乙個城市可以作為多個省的省會。聰明的

你快幫幫這個國王吧!

input

第一行包含兩個數n,b(1<=n<=1000, 1 <= b <= n)。接下來n-1行,每行描述一條邊,包含兩個數,即這

條邊連線的兩個城市的編號。

output

如果無法滿足國王的要求,輸出0。否則輸出數k,表示你給出的劃分方案中省的個數,編號為1..k。第二行輸

出n個數,第i個數表示編號為i的城市屬於的省的編號,第三行輸出k個數,表示這k個省的省會的城市編號,如果

有多種方案,你可以輸出任意一種。

sample input

8 2 

1 2

2 3

1 8

8 7

8 6

4 6

6 5

sample output

3

2 1 1 3 3 3 3 2

2 1 8

題解:

構造樹上分塊的原理是深搜,我們搜尋每乙個子樹如果我們子樹的大小已經大於b,那麼我們就把到我現在這個點為止的所有加入當前塊中,然後把我這個點設定為省會。

若到根節點的大小都小於b,那麼我就把根節點加入最近的分塊,最近的分塊一定和根節點沒有加入分塊聯通。因為我們前面的每個分塊大小一定大於b,小於2b,所以加上我們這個點附近的點之後我們這個分塊一共只有不大於3b個點。

哦,還要說一下為了防止不同的子樹(不通過省會連通)放在同乙個分塊中那麼,我們要記錄一下我的當前點在棧的位置。最多只能將這個點以前的點加入分塊。

**:

#include 

#include

const

int maxn = 10050;

using

namespace

std;

int n,b,e = 1,top,sz;

int head[maxn],s[maxn],bl[maxn],rt[maxn];

struct nodeedge[maxn];

inline

int read()

while('0'

<= ch&&ch <= '9')

return x;

}inline

void addedge(int u,int v);head[u] = e++;

}inline

void init()

}void dfs(int u,int fa) }}

s[++top] = u;

}int main()

SCOI2005 王室聯邦

這一篇類似是強聯通的東東大家參考一下吧,我也不會講這題。大家可以傳送去我同學那裡看看的qaq傳送門 提交傳送門 題目描述 餘 人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成員來管理。他的國家有n個城市,編號為1.n。一些城市之間有道路相連,任意兩個不同的城...

SCOI2005 王室聯邦

餘 人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成員來管理。他的國家有n個城市,編號為1.n。一些城市之間有道路相連,任意兩個不同的城市之間有且僅有一條直接或間接的道路。為了防止管理太過分散,每個省至少要有b個城市,為了能有效的管理,每個省最多只有3b個城...

scoi2005 王室聯邦 解題報告

拿來學了一下樹分塊。樹分塊的要求是把樹分成 n b 塊,每一塊的每個節點到這個塊的lca的之間的節點數不超過3b 好像在很久以前聽誰講過。做法是按dfs序出棧或bfs倒序考慮,把當前這個子樹的剩餘塊加到它的父親上,如果它的父親上的塊已經 b 就把這個塊取出來。這樣的話出來的就是若干大小在 b,2b ...