BZOJ1086 SCOI2005 王室聯邦

2022-09-23 20:30:11 字數 1819 閱讀 3882

【bzoj1086】[scoi2005]王室聯邦

「餘」人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成員來管理。他的國家有n個城市,編號為1..n。一些城市之間有道路相連,任意兩個不同的城市之間有且僅有一條直接或間接的道路。為了防止管理太過分散,每個省至少要有b個城市,為了能有效的管理,每個省最多只有3b個城市。每個省必須有乙個省會,這個省會可以位於省內,也可以在該省外。但是該省的任意乙個城市到達省會所經過的道路上的城市(除了最後乙個城市,即該省省會)都必須屬於該省。乙個城市可以作為多個省的省會。聰明的你快幫幫這個國王吧!

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

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

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

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

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

8 21 2

2 31 8

8 78 6

4 66 5

32 1 1 3 3 3 3 2

2 1 8

這就是王室聯邦分塊的方法

我們遍歷了某個節點的某個兒子後,統計遍歷節點中沒有被分好的節點的個數

如果遍歷完某個兒子後沒有被分好的節點個數大於b,就把這些節點分在一塊內

以當前節點為省會

剩餘不足b個的節點隨便丟在乙個塊裡面

這樣最壞的情況乙個塊內也不會超過3b個節點

最壞的情況是這樣:遍歷節點x的某個兒子節點後,當前沒有分好的節點個數為b-1,

之後遍歷x的乙個兒子y時,在y上沒有分好的節點個數為b-1,

最後剩餘不足b個的節點有b-1個正好也要分到x為省會的這個塊中

此時就會對3b-1個節點一起分塊,但並沒有超過3b個節點

唯一無解的情況就是n

#include

#define for( i , _begin , _end ) for( int i = (_begin) , i##end = (_end) ; i <= (i##end) ; i++ )

#define rep( i , _begin , _add ) for( int i = (_begin) ; i ; i = (_add) )

template< typename type >inline void read( type &in )

static const int maxn = 1e3 +1;

static const int maxm = maxn << 1;

int n , b;

int h[maxn] , nt[maxm] , to[maxm];

int stk[maxn] , tp , ct;

int bl[maxn] , cap[maxn];

void ins( int x , int y )

int dfs( int x , int f )

}stk[ ++tp ] = x;

return size + 1;

}int main()

ct = 0;

dfs( 1 , 0 );

while( tp )bl[ stk[ tp-- ] ] = ct;

printf("%d\n",ct);

for( i , 1 , n )printf("%d ",bl[i]);puts("");

for( i , 1 , ct )printf("%d ",cap[i]);puts("");

return 0;

}

bzoj1086 scoi2005 王室聯邦

題目鏈結 本來是來學樹上分塊的,沒想到正解是貪心 dfs。題意 求將樹分為幾個聯通塊,每個聯通塊大小大於b小於3b,是否可行。solution1 題都沒看就翻了題解。發現時貪心 dfs。一遍dfs即可。注意到以x為根節點時,其兒子s,則子樹s中與s相連的節點的連通塊,如果要構成乙個省,既可以s作為省...

bzoj1086 SCOI2005 王室聯邦

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

BZOJ 1086 SCOI2005 王室聯邦

啊啊啊啊啊啊啊啊啊啊啊啊 又是一道赤果果的水水模板題 沒辦法啊我太弱了。好吧 這是一道樹分塊 原題戳對其實你們依然不用戳 餘 人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成 員來管理。他的國家有n個城市,編號為1.n。一些城市之間有道路相連,任意兩個不同的...