思路:貪心,每次當儲存的兒子大於等於b時,分出乙個塊,這樣每次每個塊至多為2b,這樣剩下的沒有被分的塊小於b,可以加入任意乙個塊,都是合法的。
1 #include2 #include3 #include4 #include5 #include6int tot,go[200005],first[200005],next[200005
],n,m;
7int top,c[200005],pd,size[200005],cap[200005],belong[200005
],sz;
8int
read()
11while ('0'
<=ch&&ch<='9')
12return t*f;13}
14void insert(int x,int
y)20
void add(int x,int
y)23
void dfs(int x,int
fa)else size[x]+=size[pur];33}
34 size[x]++;35}
36void find(int x,int
fa)41
for (int i=first[x];i;i=next[i])46}
47int
main()
53if (m==1)63
for (int i=1;i)
67 dfs(1,0
);68 pd=0;69
int cnt=0
,th;
70for (int i=1;i<=n;i++)
71if (!belong[i]) cnt++,th=1;72
if (cnt>=m)
78for (int i=1;i<=n;i++)
79if (!belong[i])
83 printf("
%d\n
",sz);
84for (int i=1;i<=n;i++)
85 printf("
%d "
,belong[i]);
86 printf("\n"
); 87
for (int i=1;i<=sz;i++)
88 printf("
%d "
,cap[i]);
89 printf("\n"
); 90 }
bzoj1086 王室聯邦
給出一棵樹,求一種分塊方案,使得每個塊的大小 size in b,3b 每個塊還要選乙個省會,省會可以在塊外,但是省會到塊內任何乙個點路徑上的所有除了省會的點都必須屬於這個塊。n le 1000 一次dfs即可解決。做法如下 實現中有乙個問題,對於乙個兒子,它在棧中積累了不到 b 個點,而在下乙個搜...
bzoj 1086 王室聯邦
餘 人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成員來管理。他的國家有n個城市,編號為1.n。一些城市之間有道路相連,任意兩個不同的城市之間有且僅有一條直接或間接的道路。為了防止管理太過分散,每個省至少要有b個城市,為了能有效的管理,每個省最多只有3b個城...
王室聯邦(bzoj 1086)
餘 人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成 員來管理。他的國家有n個城市,編號為1.n。一些城市之間有道路相連,任意兩個不同的城市之間有且僅有一條 直接或間接的道路。為了防止管理太過分散,每個省至少要有b個城市,為了能有效的管理,每個省最多只有3b...