有這樣乙個貪心的思路:當某乙個點搜完某個兒子後,發現當前子樹中沒有被選入其他省的點數超過了b,就將其當做乙個省,並把這個點作為省會(注意:這個點並沒有進入這個省),顯然可以發現此時每乙個省的點數都小於2b
。另外,當搜完後發現還有小於b的點,那麼就將這些點都歸入最後乙個省,省的點數仍然小於3b
。
1 #include2view codeusing
namespace
std;
3#define n 1005
4struct
jiedge[n<<1];7
inte,n,m,x,y,head[n],st[n],vis[n],s[n];
8void add(int x,int
y)13
void dfs(int k,int
fa)22
}23 st[++st[0]]=k;24}
25int
main()
33 dfs(1,0
);34
while (st[0])vis[st[st[0]--]]=s[0
];35 printf("
%d\n
",s[0
]);36
for(int i=1;i<=n;i++)printf("
%d "
,vis[i]);
37 printf("\n"
);38
for(int i=1;i<=s[0];i++)printf("
%d "
,s[i]);
39 }
bzoj1086 王室聯邦
給出一棵樹,求一種分塊方案,使得每個塊的大小 size in b,3b 每個塊還要選乙個省會,省會可以在塊外,但是省會到塊內任何乙個點路徑上的所有除了省會的點都必須屬於這個塊。n le 1000 一次dfs即可解決。做法如下 實現中有乙個問題,對於乙個兒子,它在棧中積累了不到 b 個點,而在下乙個搜...
bzoj 1086 王室聯邦
餘 人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成員來管理。他的國家有n個城市,編號為1.n。一些城市之間有道路相連,任意兩個不同的城市之間有且僅有一條直接或間接的道路。為了防止管理太過分散,每個省至少要有b個城市,為了能有效的管理,每個省最多只有3b個城...
BZOJ 1086 王室聯邦
思路 貪心,每次當儲存的兒子大於等於b時,分出乙個塊,這樣每次每個塊至多為2b,這樣剩下的沒有被分的塊小於b,可以加入任意乙個塊,都是合法的。1 include2 include3 include4 include5 include6 int tot,go 200005 first 200005 n...