【树形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
",i);
35     return 0;
36 }
View Code
原文地址:https://www.cnblogs.com/xkui/p/4553188.html