利用了樹上莫隊的分塊方式,保證每個塊的大小都\(\ge\)b且$\le$3b,然後證明略過
僅敘述一下演算法的過程
使用乙個棧,依次dfs這個點的每個子樹,如果發現新增的節點數大於等於b,就分出新的一塊,
最後把剩下的節點塞進最後乙個塊裡
分塊的**
void dfs(int u,int f)}}
s.push(u);
}
#include #include #include #include using namespace std;
stacks;
int v[5000],fir[5000],nxt[5000],cnt,b,n,core[5000],block_cnt=0,belong[5000];
void addedge(int ui,int vi)
void dfs(int u,int f)}}
s.push(u);
}int main()
dfs(1,0);
while(!s.empty())
printf("%d\n",block_cnt);
for(int i=1;i<=n;i++)
printf("%d ",belong[i]);
printf("\n");
for(int i=1;i<=block_cnt;i++)
printf("%d ",core[i]);
printf("\n");
return 0;
}
P2325 SCOI2005 王室聯邦
傳送門 一遍dfs,如果某個子樹的未劃分的個數大於等於 b 那麼就把他們單獨劃為乙個省,該點作為省會 最後把所有剩下的和 1 劃到乙個省就好了 minamoto include define r register define fp i,a,b for r int i a,i b 1 ii i de...
P2325 SCOI2005 王室聯邦 解題報告
餘 人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成員來管理。他的國家有 n 個城市,編號為 1 dots n 一些城市之間有道路相連,任意兩個不同的城市之間有且僅有一條直接或間接的道路。為了防止管理太過分散,每個省至少要有 b 個城市,為了能有效的管理,每...
SCOI2005 王室聯邦
這一篇類似是強聯通的東東大家參考一下吧,我也不會講這題。大家可以傳送去我同學那裡看看的qaq傳送門 提交傳送門 題目描述 餘 人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成員來管理。他的國家有n個城市,編號為1.n。一些城市之間有道路相連,任意兩個不同的城...