bzoj1086 scoi2005 王室聯邦

2021-07-15 23:52:24 字數 1783 閱讀 1658

(題目鏈結)

本來是來學樹上分塊的,沒想到正解是貪心+dfs。。。

題意:求將樹分為幾個聯通塊,每個聯通塊大小大於b小於3b,是否可行。

solution1

題都沒看就翻了題解。。發現時貪心+dfs。

一遍dfs即可。注意到以x為根節點時,其兒子s,則子樹s中與s相連的節點的連通塊,如果要構成乙個省,既可以s作為省會還可以x作為省會。如果用s作為省會,那s的子樹 < b怎麼辦?所以以x為省會。這樣將x的子樹中沒有標號的每超過b個就連成乙個省份。當然如果以x為節點的樹小於b,那就在x的父節點中操作。由於是從下往上操作,所以那些沒有標號的一定與x的其中乙個兒子s構成連通塊。那為什麼是3b呢?這樣不是2b就夠了嗎?考慮到對於根節點r,最後還剩下小於b個的節點沒有省份,這樣將剩下來的點併入最後乙個省份,以x為省會即可。

考慮操作。顯然這需要乙個棧來維護,每次回去之前將x加入棧裡面。然後棧中在當前樹中的節點超過b個時就將這b個放到乙個省裡。

**:

// bzoj3757

#include

#include

#include

#include

#include

#include

#define mod 1000000007

#define inf 2147483640

#define ll long long

#define free(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);

using namespace std;

inline ll getint()

while (ch>='0' && ch<='9')

return

x*f;

}const int maxn=1010;

struct edge e[maxn<<2];

int head[maxn],size[maxn],pos[maxn],q[maxn],n,b,cnt,top,c,cap[maxn];

void insert(int u,int v)

void dfs(int

x,int fa)

else size[x]+=size[e[i].to];

}size[x]++;

}void paint(int

x,int fa,int c)

int main()

if (nprintf("0");return

0;} cnt=0;dfs(1,0);

if (!cnt) cap[++cnt]=1;

paint(1,0,cnt);

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

for (int i=1;i<=n;i++) printf("%d ",pos[i]);

printf("\n");

for (int i=1;i<=cnt;i++) printf("%d ",cap[i]);

return

0;}

solution2

看了下別人的部落格,其實做法就跟dfs差不多,只是換了個高大上的名字而已。。

每當掃到發現子樹結點已經不小於b了,那麼考慮把他們直接劃成乙個省,並且以當前根結點為省會即可。並且把子樹中所有結點劃到乙個塊中,用棧維護一下就可以了。那麼最後會剩下一些結點,隨便丟哪個塊都是可以的,只要發現路上有乙個點已經被劃成某個塊中,那麼把接下來的子樹中的點也都劃成這個塊即可,這樣才能保證題目要求。

是不是跟dfs很相似?(幾乎一模一樣= =)

**就懶得貼了。

bzoj1086 SCOI2005 王室聯邦

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

BZOJ 1086 SCOI2005 王室聯邦

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

BZOJ 1086 SCOI2005 王室聯邦

對一棵樹進行分塊。dfs,找到了乙個節點,記錄乙個陣列st s t,代表它和它的子樹中,沒有被劃分進任何省的點。首先對他的每個節點dfs,把它兒子的st s t序列加入自己的,如果自己st s t序列大於了 b b 就把這所有的點都划進乙個省裡面,省會是當前dfs到的這個節點。最後再把自己加入st ...