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 2sample output1 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
我們用dfs暴力,然後每到乙個子樹,我們就進行遞迴。如果》=b,我們就可以把這個當成乙個省,省會就是根。水(參考xgc)**
#include
#include
#include
#include
using namespace std;
struct node
a[110000];int len,last[110000];
void ins(int
x,int
y)int belong[1100],sh[1100];
int sta[1100],top,cnt,n,m;
void dfs(int
x,int fa)}}
}sta[++top]=x;
}int main()
len=0;memset(last,0,sizeof(last));
for(int i=1;iint
x,y;
scanf("%d
%d",&x,&y);
ins(x,y);ins(y,x);
}cnt=top=0;
dfs(1,0);
while(top)
printf("%d\n",cnt);
for(int i=1;i<=n;i++)printf("%d ",belong[i]);
printf("\n");
for(int i=1;i<=cnt;i++)printf("%d ",sh[i]);
printf("\n");
return
0;}
bzoj1086 王室聯邦 dfs
看到題目完全不會做的樣子。為什麼是 3b?這個3有什麼用?n才1000是不是可以動態規劃比如f i x 表示以i為根i在大小為x的塊中?然而轉移方程似乎比較複雜,應該是乙個分組揹包一樣的東西。關鍵是輸出分類方法,這怎麼輸出啊。於是果斷翻題解。意料之外情理之中。一遍dfs即可。注意到以x為根節點時,其...
bzoj1086 王室聯邦
給出一棵樹,求一種分塊方案,使得每個塊的大小 size in b,3b 每個塊還要選乙個省會,省會可以在塊外,但是省會到塊內任何乙個點路徑上的所有除了省會的點都必須屬於這個塊。n le 1000 一次dfs即可解決。做法如下 實現中有乙個問題,對於乙個兒子,它在棧中積累了不到 b 個點,而在下乙個搜...
bzoj 1086 王室聯邦
餘 人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成員來管理。他的國家有n個城市,編號為1.n。一些城市之間有道路相連,任意兩個不同的城市之間有且僅有一條直接或間接的道路。為了防止管理太過分散,每個省至少要有b個城市,為了能有效的管理,每個省最多只有3b個城...