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

实现不难,对我这种辣鸡来说有一定的思维量。

对于每个点我们只需要知道它的子树大小的总和和它最大的子树大小是多少就可以了。

因为对于每个点 只要知道了它的子树大小的总和那么也就知道了 它的所有父亲以及兄弟的数量(n-子树大小)

因为对于这个点来说,割去后对答案产生影响的只有它最大的子树大小。

如果割去这个点后 它的所有父亲以及兄弟的数量<=n/2 同时 最大的子树大小也<=n/2

那么一定是可行的。

#include <cstdio>
#include <algorithm>

using std::max;

struct node{
    int u,v,next;
    node(){}
    node(int _u,int _v,int _next){
        u = _u;
        v = _v;
        next = _next;
    }
}Edge[20005];

int n,head[20005],Count;
int sum[20005],Max[20005];

inline void AddEdge(int u,int v){
    Count++;
    Edge[Count] = node(u,v,head[u]);
    head[u] = Count;
}

void dfs(int x,int fa){
    sum[x]=1;
    for(int i=head[x];i;i=Edge[i].next){
        int v = Edge[i].v;
        if(v==fa) continue;
        dfs(v,x);
        sum[x]+=sum[v];
    }
    for(int i=head[x];i;i=Edge[i].next){
        int v = Edge[i].v;
        Max[x] = max(Max[x],sum[v]);
    }
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<n;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        AddEdge(u,v);
        AddEdge(v,u);
    }
    dfs(1,-1);
    int limit = n/2;
    for(int i=1;i<=n;i++){
        if(n-sum[i]<=limit && Max[i] <= limit ) printf("%d\n",i);
    }
    return 0;
}
时间: 2024-10-06 14:48:07

BZOJ 3391 [Usaco2004 Dec]Tree Cutting网络破坏的相关文章

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

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)个牛棚.她打算切断某一个牛棚的电源,使和这个牛棚相连的

bzoj3391 [Usaco2004 Dec]Tree Cutting网络破坏

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

【树形dp】Bzoj3391 [Usaco2004 Dec]Tree Cutting网络破坏

Description 约翰意识到贝茜建设网络花费了他巨额的经费,就把她解雇了.贝茜很愤怒,打算狠狠报 复.她打算破坏刚建成的约翰的网络.    约翰的网络是树形的,连接着N(1≤N≤10000)个牛棚.她打算切断某一个牛棚的电源,使和这个牛棚相连的所有电缆全部中断.之后,就会存在若干子网络.为保证破坏够大,每一个子网的牛棚数不得超过总牛棚数的一半,那哪些牛棚值得破坏呢? Solution 树形dp裸题,刷水好欢乐. Code 1 #include<cstdio> 2 const int ma

【枚举】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];

BZOJ 3389: [Usaco2004 Dec]Cleaning Shifts安排值班

题目 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MB Description 一天有T(1≤T≤10^6)个时段.约翰正打算安排他的N(1≤N≤25000)只奶牛来值班,打扫 打扫牛棚卫生.每只奶牛都有自己的空闲时间段[Si,Ei](1≤Si≤Ei≤T),只能把空闲的奶牛安排出来值班.而且,每个时间段必需有奶牛在值班.  那么,最少需要动用多少奶牛参与值班呢?如果没有办法安排出合理的

BZOJ 3390: [Usaco2004 Dec]Bad Cowtractors牛的报复

题目 3390: [Usaco2004 Dec]Bad Cowtractors牛的报复 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 53  Solved: 37[Submit][Status] Description 奶牛贝茜被雇去建设N(2≤N≤1000)个牛棚间的互联网.她已经勘探出M(1≤M≤ 20000)条可建的线路,每条线路连接两个牛棚,而且会苞费C(1≤C≤100000).农夫约翰吝啬得很,他希望建设费用最少甚至他都不想给贝茜工钱. 

Bzoj 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 最短路,神题

3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 218  Solved: 86[Submit][Status][Discuss] Description 一天有T(1≤T≤10^6)个时段.约翰正打算安排他的N(1≤N≤25000)只奶牛来值班,打扫 打扫牛棚卫生.每只奶牛都有自己的空闲时间段[Si,Ei](1≤Si≤Ei≤T),只能把空闲的奶牛安排出来值班.而且,每个

bzoj 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 -- 贪心

3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MB Description 一天有T(1≤T≤10^6)个时段.约翰正打算安排他的N(1≤N≤25000)只奶牛来值班,打扫 打扫牛棚卫生.每只奶牛都有自己的空闲时间段[Si,Ei](1≤Si≤Ei≤T),只能把空闲的奶牛安排出来值班.而且,每个时间段必需有奶牛在值班.  那么,最少需要动用多少奶牛参与值班呢?如果没有办法安排出合理的方案,