【树形dp】Bzoj3391 [Usaco2004 Dec]Tree Cutting网络破坏
Description
约翰意识到贝茜建设网络花费了他巨额的经费,就把她解雇了.贝茜很愤怒,打算狠狠报
复.她打算破坏刚建成的约翰的网络. 约翰的网络是树形的,连接着N(1≤N≤10000)个牛棚.她打算切断某一个牛棚的电源,使和这个牛棚相连的所有电缆全部中断.之后,就会存在若干子网络.为保证破坏够大,每一个子网的牛棚数不得超过总牛棚数的一半,那哪些牛棚值得破坏呢?
Solution
树形dp裸题,刷水好欢乐。
Code
1 #include<cstdio> 2 const int maxn=1e5+5; 3 4 int n,f[maxn],d[maxn]; 5 int head[maxn],e[maxn*2],nxt[maxn*2],cnt; 6 int adde(int u,int v){ 7 e[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt; 8 e[++cnt]=u;nxt[cnt]=head[v];head[v]=cnt; 9 } 10 11 int dfs(int p,int u){ 12 d[u]=1; 13 for(int i=head[u];i;i=nxt[i]){ 14 int v=e[i]; 15 if(v==p) continue; 16 dfs(u,v); 17 d[u]+=d[v]; 18 if(d[v]>n/2) f[u]=1; 19 } 20 if(n-d[u]>n/2) f[u]=1; 21 } 22 23 int main(){ 24 scanf("%d",&n); 25 int u,v; 26 27 for(int i=1;i<n;i++){ 28 scanf("%d%d",&u,&v); 29 adde(u,v); 30 } 31 dfs(0,1); 32 33 for(int i=1;i<=n;i++) 34 if(!f[i]) printf("%d\n",i); 35 return 0; 36 }