1086 SCOI2005 王室聯邦

2022-09-19 08:24:08 字數 1110 閱讀 4608

給定一棵樹,要求將這棵樹分成一些塊,使每塊大小在[b,3b]之間

首先任選一點開始深搜 維護乙個棧 每個點退出遞迴時壓棧 自下至上進行合併

如果某棵子樹深搜完之後棧內元素數》=b 就把當前的棧內元素合併為乙個塊

但是這種方法存在乙個問題 就是如果某棵子樹深搜之後不到b 去深搜下乙個子樹 可能在下乙個子樹內部的某個位置超過b 這樣會導致分成的塊不連通

因此我們在每次進入遞迴時維護乙個棧底,對於當前子樹來說這個棧底就是整個棧的底,棧底以下的元素不能修改或彈棧

這樣當一棵子樹深搜過後由於子樹內未分塊節點不超過b,之前搜過的未分塊節點數也不超過b,因此每塊不超過2b

那麼題目為什麼給了3b呢? 深搜結束後可能會剩餘一些節點,這些節點的數量不超過b,而且一定與當前分出的最後一塊連通

因此我們將剩餘節點分到最後一塊中,可以保證最後一塊的大小不超過3b

一遍深搜即可出解。

//

achen

#include#include

#include

#include

#include

#include

#include

#include

#include

const

int n=1005

;typedef

long

long

ll;using

namespace

std;

intn,b;

template

void read(t &x)

int ecnt,fir[n],nxt[n*2],to[n*2

],top;

void add(int u,int

v) int

id[n],rt[n],tot,sta[n];

void dfs(int x,int

f) }

sta[++top]=x;

}void

work()

void

init()

}int

main()

王室聯邦

1086 SCOI2005 王室聯邦

time limit 10 sec memory limit 162 mbsec special judge submit 2691 solved 1639 submit status discuss 餘 人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成 員...

bzoj1086 scoi2005 王室聯邦

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

bzoj1086 SCOI2005 王室聯邦

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