time limit: 10 sec memory limit: 162 mbsec special judge
submit: 1749 solved: 1056
「餘」人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成
員來管理。他的國家有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
樹 貪心 (偽)樹分塊
聽說是樹分塊裸題……喜+1系列
按dfs序遍歷整棵樹,發現子樹大小大於b,就把它們劃成一塊
這樣分出來,每棵子樹的大小都在b~2b之間。
最後還會剩下一些零碎的結點,它們的總數小於b(不然就被劃分了),把它們拼到最近的塊裡,該塊尺寸不會超過3b,滿足要求。
n寫啥wa啥系列,34行把cnt寫成u掛了一次
1 #include2 #include3 #include4 #include5 #include6using
namespace
std;
7const
int mxn=2010;8
intread()
11while(ch>='
0' && ch<='9')
12return x*f;13}
14struct
edgee[mxn<<1
];17
int hd[mxn],mct=0;18
void add_edge(int u,int
v)21
//22
intn,b;
23int
t[mxn],c[mxn],sz[mxn];
24int st[mxn],top=0,cnt=0;25
void dfs(int u,int
fa)36 sz[u]=0;37
}38else sz[u]+=sz[v];39}
40 ++sz[u];
41return;42
}43void dfs2(int u,int fa,int
c)50
return;51
}52intmain()
56for(i=1;i)
60 dfs(1,0
);61
//62
if(!cnt)
63 dfs2(1,0
,cnt);
64 printf("
%d\n
",cnt);
65for(i=1;i<=n;i++)printf("\n"
);66
for(i=1;i<=cnt;i++)printf("\n"
);67
return0;
68 }
bzoj1086 scoi2005 王室聯邦
題目鏈結 本來是來學樹上分塊的,沒想到正解是貪心 dfs。題意 求將樹分為幾個聯通塊,每個聯通塊大小大於b小於3b,是否可行。solution1 題都沒看就翻了題解。發現時貪心 dfs。一遍dfs即可。注意到以x為根節點時,其兒子s,則子樹s中與s相連的節點的連通塊,如果要構成乙個省,既可以s作為省...
bzoj1086 SCOI2005 王室聯邦
description 餘 人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成員來管理。他的國家有n個城市,編號為1.n。一些城市之間有道路相連,任意兩個不同的城市之間有且僅有一條直接或間接的道路。為了防止管理太過分散,每個省至少要有b個城市,為了能有效的管理...
BZOJ 1086 SCOI2005 王室聯邦
啊啊啊啊啊啊啊啊啊啊啊啊 又是一道赤果果的水水模板題 沒辦法啊我太弱了。好吧 這是一道樹分塊 原題戳對其實你們依然不用戳 餘 人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成 員來管理。他的國家有n個城市,編號為1.n。一些城市之間有道路相連,任意兩個不同的...