【USACO 2004 DEC】网络破坏Tree Cutting(DFS)

题目描述

约翰意识到贝茜建设网络花费了他巨额的经费,就把她解雇了.贝茜很愤怒,打算狠狠报

复.她打算破坏刚建成的约翰的网络.

约翰的网络是树形的,连接着N(1≤N≤10000)个牛棚.她打算切断某一个牛棚的电源,使和这个牛棚相连的所有电缆全部中断.之后,就会存在若干子网络.为保证破坏够大,每一个子网的牛棚数不得超过总牛棚数的一半,哪些牛棚值得破坏呢?

输入

第1行:一个整数N.

第2到N行:每行输入两个整数,表示一条电缆的两个端点.

输出

按从小到大的顺序,输出所有值得破坏的牛棚.如果没有一个值得破坏,就输出“NONE”.

本题网络是一个无根树,那么我们可以进行搜索,记录每一棵以x节点为根的子树的节点数,最后枚举每一个点,假如这个点以它的子节点为根的子树节点数,与节点总数减去这个点为根的子树节点数均不大于n/2,就可以将这个点输出。(其实这道题根本不可能有NONE的情况)

 1 #include <cstdio>
 2 #include <vector>
 3
 4 #define N 10001
 5
 6 int n,a,b,ans,num[N],pre[N];
 7 std::vector<int> g[N];
 8
 9 int dfs(int u,int fa){
10     pre[u]=fa;
11     if((g[u].size()==1)&&(u!=1))return num[u]=1;
12     int sum=0;
13     for(int i=0;i<g[u].size();++i){
14         int v=g[u][i];
15         if(v==fa)continue;
16         sum+=dfs(v,u);
17     }
18     return num[u]=sum+1;
19 }
20
21 int main(void){
22     scanf("%d",&n);
23     for(int i=1;i<n;++i){
24         scanf("%d%d",&a,&b);
25         g[a].push_back(b);
26         g[b].push_back(a);
27     }
28     dfs(1,0);
29     for(int i=1;i<=n;++i){
30         bool p=true;
31         if(num[1]-num[i]>n/2)continue;
32         for(int j=0;j<g[i].size();++j){
33             int v=g[i][j];
34             if(v==pre[i])continue;
35             if(num[v]>n/2)p=false;
36         }
37         if(p){
38             ++ans;
39             printf("%d\n",i);
40         }
41     }
42     if(ans==0)printf("NONE");
43 }

原文地址:https://www.cnblogs.com/gzh01/p/9385325.html

时间: 2024-10-28 22:50:57

【USACO 2004 DEC】网络破坏Tree Cutting(DFS)的相关文章

【BZOJ】【1986】【USACO 2004 Dec】/【POJ】【2373】划区灌溉

DP/单调队列优化 首先不考虑奶牛的喜欢区间,dp方程当然是比较显然的:$ f[i]=min(f[k])+1,i-2*b \leq k \leq i-2*a $  当然这里的$i$和$k$都是偶数啦~这个应该很好理解吧……每次喷灌的都是一个偶数长度的区间嘛…… 那么加上奶牛的喜欢区间的话,只需这样:当$ i>cow[j].x $时,令$ i=cow[j].y , j++$ 也就是说中间的位置全部不考虑放喷灌器. 显然我们对于每个节点的 k 是可以用单调队列维护的!嗯看到这里的同学可以先自己试着去

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

Codeforces Round #540 (Div. 3) F1. Tree Cutting (Easy Version) 【DFS】

任意门:http://codeforces.com/contest/1118/problem/F1 F1. Tree Cutting (Easy Version) time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given an undirected tree of nn vertices. Some vert

POJ2378——Tree Cutting

Distance Statistics Time Limit: 2000MS   Memory Limit: 64000K Total Submissions: 1660   Accepted: 528 Case Time Limit: 1000MS Description Frustrated at the number of distance queries required to find a reasonable route for his cow marathon, FJ decide

【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

poj 2378 Tree Cutting (树形dp)

Tree Cutting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3910   Accepted: 2347 Description After Farmer John realized that Bessie had installed a "tree-shaped" network among his N (1 <= N <= 10,000) barns at an incredible

【HDU5909】Tree Cutting(FWT)

[HDU5909]Tree Cutting(FWT) 题面 vjudge 题目大意: 给你一棵\(n\)个节点的树,每个节点都有一个小于\(m\)的权值 定义一棵子树的权值为所有节点的异或和,问权值为\(0..m-1\)的所有子树的个数 题解 考虑\(dp\) 设\(f[i][j]\)表示以\(i\)为根节点的子树中,异或和为\(j\)的子树的个数 很显然,每次合并就是两个\(dp\)值做\(xor\)卷积 那么直接用\(FWT\)优化就行了 #include<iostream> #inclu

USACO翻译:USACO 2014 DEC Silver三题

USACO 2014 DEC SILVER 一.题目概览 中文题目名称 回程 奶牛IDs 搬家 英文题目名称 piggyback cowids relocate 可执行文件名 piggyback cowids relocate 输入文件名 piggyback.in cowids.in relocate.in 输出文件名 piggyback.out cowids.out relocate.out 每个测试点时限 1秒 1秒 1秒 测试点数目 10 10 10 每个测试点分值 10 10 10 比较