【树形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 }

时间: 2024-10-26 17:17:54

【树形dp】Bzoj3391 [Usaco2004 Dec]Tree Cutting网络破坏的相关文章

bzoj3391 [Usaco2004 Dec]Tree Cutting网络破坏

Description 约翰意识到贝茜建设网络花费了他巨额的经费,就把她解雇了.贝茜很愤怒,打算狠狠报 复.她打算破坏刚建成的约翰的网络.    约翰的网络是树形的,连接着N(1≤N≤10000)个牛棚.她打算切断某一个牛棚的电源,使和这个牛棚相连的所有电缆全部中断.之后,就会存在若干子网络.为保证破坏够大,每一个子网的牛棚数不得超过总牛棚数的一半,那哪些牛棚值得破坏呢? Input 第1行:一个整数N. 第2到N+1行:每行输入两个整数,表示一条电缆的两个端点. Output 按从小到大的顺序

【枚举】bzoj3391 [Usaco2004 Dec]Tree Cutting网络破坏

#include<cstdio> using namespace std; #define N 10001 int n; int v[N<<1],first[N],next[N<<1],en; void AddEdge(int U,int V) { v[++en]=V; next[en]=first[U]; first[U]=en; } int size[N],fa[N]; void dfs(int U) { size[U]=1; for(int i=first[U];

3391: [Usaco2004 Dec]Tree Cutting网络破坏

3391: [Usaco2004 Dec]Tree Cutting网络破坏 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 76  Solved: 59[Submit][Status][Discuss] Description 约翰意识到贝茜建设网络花费了他巨额的经费,就把她解雇了.贝茜很愤怒,打算狠狠报 复.她打算破坏刚建成的约翰的网络.    约翰的网络是树形的,连接着N(1≤N≤10000)个牛棚.她打算切断某一个牛棚的电源,使和这个牛棚相连的

BZOJ 3391: [Usaco2004 Dec]Tree Cutting网络破坏( dfs )

因为是棵树 , 所以直接 dfs 就好了... ------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ; i < n

BZOJ 3391 [Usaco2004 Dec]Tree Cutting网络破坏

实现不难,对我这种辣鸡来说有一定的思维量. 对于每个点我们只需要知道它的子树大小的总和和它最大的子树大小是多少就可以了. 因为对于每个点 只要知道了它的子树大小的总和那么也就知道了 它的所有父亲以及兄弟的数量(n-子树大小) 因为对于这个点来说,割去后对答案产生影响的只有它最大的子树大小. 如果割去这个点后 它的所有父亲以及兄弟的数量<=n/2 同时 最大的子树大小也<=n/2 那么一定是可行的. #include <cstdio> #include <algorithm&g

hdu 4003 树形dp+分组背包 2011大连赛区网络赛C

题意:求K个机器人从同一点出发,遍历所有点所需的最小花费 链接:点我 Sample Input 3 1 1 //3个点,从1出发,1个机器人 1 2 1 1 3 1 3 1 2 1 2 1 1 3 1 Sample Output 3 2 转移方程: dp[i][j]=min(dp[i][j],dp[i][j*k],dp[son[i]][k]+len(i,son[i])*k) 方程还是比较好写的,主要是要遍历所有的点 下面我们分析一下第一个样例 1 / \ / \ 2 3 我们派了一个机器人去3,

【树形DP】HDU 3534 Tree

通道 题意:给定n个点的树,问树的直径有多少条 代码: #include<stdio.h> #include<string.h> const int N=500000; const int inf=0x3fffffff; int head[N],num,Len[N],ans,node[N],k; struct edge { int ed,w,next; }e[N*2]; void addedge(int x,int y,int w) { e[num].ed=y;e[num].w=w

树形DP CCPC网络赛 HDU5834 Magic boy Bi Luo with his excited tree

1 // 树形DP CCPC网络赛 HDU5834 Magic boy Bi Luo with his excited tree 2 // 题意:n个点的树,每个节点有权值为正,只能用一次,每条边有负权,可以走多次,问从每个点出发的最大获益 3 // 思路: 4 // dp[i]: 从i点出发回到i点的最大值 5 // d[i][0] 从i点出发不回来的最大值 6 // d[i][1] 从i点出发取最大值的下一个点 7 // d[i][2] 从i点出发取次大值 8 // dfs1处理出这四个 9

【HDU 5909】 Tree Cutting (树形依赖型DP+点分治)

Tree Cutting Problem Description Byteasar has a tree T with n vertices conveniently labeled with 1,2,...,n. Each vertex of the tree has an integer value vi. The value of a non-empty tree T is equal to v1⊕v2⊕...⊕vn, where ⊕ denotes bitwise-xor. Now fo