1086 SCOI2005 王室聯邦

2022-05-16 05:45:42 字數 1915 閱讀 5062

time limit: 10 sec  memory limit: 162 mbsec  special judge

submit: 2691  solved: 1639

[submit][status][discuss]

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

員來管理。他的國家有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 2

1 2

2 3

1 8

8 7

8 6

4 6

6 5

3 2 1 1 3 3 3 3 2

2 1 8

實際上仔細分析就會發現不可能「無法滿足國王的要求」,因為b≤n恆成立

樹分塊,莫隊演算法中有提到

從樹根開始向下搜尋,回溯時計算塊的大小,一旦滿足≥b,則分為乙個塊。

最後將剩下的點,連入最後乙個塊,(為什麼成立自己思考一下)

1 #include2 #include3

using

namespace

std;45

const

int maxn=4000;6

7struct

edge

8e[maxn];

11int

node,head[maxn];

1213

intn,b,top,rt;

14int

q[maxn],size[maxn],root[maxn],belong[maxn];

1516

void insert(int u,int

v)17

;head[u]=node;

19 e[++node]=(edge);head[v]=node;20}

2122

void dfs(int x,int

f)23

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

38 size[x]++;39}

4041

intmain()

4250 dfs(1,0

);51

while

(top)

52 belong[q[top--]]=rt;

53 printf("

%d\n

",rt);

54for(int i=1;i<=n;i++)

55 printf("

%d "

,belong[i]);

56 printf("\n"

);57

for(int i=1;i<=rt;i++)

58 printf("

%d "

,root[i]);

59return0;

60 }

1086 SCOI2005 王室聯邦

給定一棵樹,要求將這棵樹分成一些塊,使每塊大小在 b,3b 之間 首先任選一點開始深搜 維護乙個棧 每個點退出遞迴時壓棧 自下至上進行合併 如果某棵子樹深搜完之後棧內元素數 b 就把當前的棧內元素合併為乙個塊 但是這種方法存在乙個問題 就是如果某棵子樹深搜之後不到b 去深搜下乙個子樹 可能在下乙個子...

bzoj1086 scoi2005 王室聯邦

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

bzoj1086 SCOI2005 王室聯邦

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