国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Bzoj 1086: [SCOI2005]王室聯邦(分塊)

2019-11-11 02:01:30
字體:
來源:轉載
供稿:網友

1086: [SCOI2005]王室聯邦 Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 1557 Solved: 936 [Submit][Status][Discuss] Description   “余”人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的一個成 員來管理。他的國家有n個城市,編號為1..n。一些城市之間有道路相連,任意兩個不同的城市之間有且僅有一條 直接或間接的道路。為了防止管理太過分散,每個省至少要有B個城市,為了能有效的管理,每個省最多只有3B個 城市。每個省必須有一個省會,這個省會可以位于省內,也可以在該省外。但是該省的任意一個城市到達省會所經 過的道路上的城市(除了最后一個城市,即該省省會)都必須屬于該省。一個城市可以作為多個省的省會。聰明的 你快幫幫這個國王吧! Input   第一行包含兩個數N,B(1<=N<=1000, 1 <= B <= N)。接下來N-1行,每行描述一條邊,包含兩個數,即這 條邊連接的兩個城市的編號。 Output   如果無法滿足國王的要求,輸出0。否則輸出數K,表示你給出的劃分方案中省的個數,編號為1..K。第二行輸 出N個數,第I個數表示編號為I的城市屬于的省的編號,第三行輸出K個數,表示這K個省的省會的城市編號,如果 有多種方案,你可以輸出任意一種。 Sample Input 8 2 1 2 2 3 1 8 8 7 8 6 4 6 6 5 Sample Output 3 2 1 1 3 3 3 3 2 2 1 8

/*王室聯邦分塊.保證塊直徑,大小,個數,不保證聯通.并不會證明. */#include<cstring>#include<cstdio>#include<queue>#define MAXN 1001using namespace std;struct data{int v,next;}e[MAXN*2];int n,m,k,top,tot,cut,stack[MAXN],root[MAXN],fa[MAXN],head[MAXN],belong[MAXN];int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar(); return x*f;}void add(int u,int v){ e[++cut].v=v; e[cut].next=head[u]; head[u]=cut;}void dfs(int u,int f){ fa[u]=f; int sum=top; for(int i=head[u];i;i=e[i].next) { int v=e[i].v; if(v==f) continue; fa[v]=u,dfs(v,u); if(top-sum>=k) { root[++tot]=u; do { belong[stack[top]]=tot,top--; }while(top!=sum); } } stack[++top]=u; return ;}int main(){ int x,y; n=read(),k=read(); for(int i=1;i<=n-1;i++) x=read(),y=read(),add(x,y),add(y,x); dfs(1,1); while(top) { x=stack[top--]; belong[x]=tot; }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 嘉黎县| 海城市| 武平县| 澄城县| 信阳市| 青川县| 邵阳县| 棋牌| 招远市| 牟定县| 江源县| 遂川县| 响水县| 涟水县| 清河县| 柞水县| 巫山县| 烟台市| 谢通门县| 巴南区| 左贡县| 长春市| 文昌市| 育儿| 正宁县| 平远县| 尚义县| 烟台市| 大姚县| 武邑县| 仁寿县| 永定县| 远安县| 沾益县| 玛多县| 康乐县| 东山县| 文安县| 临湘市| 日土县| 土默特左旗|