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

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

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 76  Solved: 59
[Submit][Status][Discuss]

Description

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

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

Input

第1行:一个整数N.

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

Output

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

Sample Input

10
1 2
2 3
3 4
4 5
6 7
7 8
8 9
9 10
3 8

Sample Output

3
8

如果牛棚3或牛棚8被破坏,剩下的三个子网节点数将是5,2,2,没有超过5的.
来源信息

HINT

Source

Silver

题解:一道树的水题,关键在于如何快速求出各点周围的子树大小,其实只需要DFS预处理出以某点(比如点1)为根的树各个子树的大小,然后对于某一点而言,各子树大小即为在有根树的状况下它的各个子树大小,还有另一个子树大小就是n-size[x](size[x]标是有根树的情形下以x为根的子树的大小),然后简单判断即可,复杂度O(N)

 1 /**************************************************************
 2     Problem: 3391
 3     User: HansBug
 4     Language: Pascal
 5     Result: Accepted
 6     Time:16 ms
 7     Memory:1716 kb
 8 ****************************************************************/
 9
10 type
11     point=^node;
12     node=record
13                g:longint;
14                next:point;
15     end;
16 var
17    i,j,k,l,m,n:longint;
18    a:array[0..100000] of point;
19    b:array[0..100000] of longint;
20    c:array[0..100000] of longint;
21 procedure add(x,y:longint);
22           var p:point;
23           begin
24                new(p);p^.g:=y;;
25                p^.next:=a[x];a[x]:=p;
26           end;
27 procedure dfs(y,x:longint);
28           var p:point;i:longint;
29           begin
30                p:=a[x];b[x]:=1;i:=1;
31                while p<>nil do
32                      begin
33                           if p^.g<>y then
34                              begin
35                                   dfs(x,p^.g);
36                                   if b[p^.g]>(n div 2) then i:=0;
37                                   inc(b[x],b[p^.g]);
38
39                              end;
40                           p:=p^.next;
41                      end;
42                if ((n-b[x])<=(n div 2)) and (i=1) then
43                   begin
44                        inc(c[0]);
45                        c[c[0]]:=x;
46                   end;
47           end;
48 procedure sort(l,r:longint);
49           var i,j,x,y:longint;
50           begin
51                i:=l;j:=r;x:=c[(l+r) div 2];
52                repeat
53                      while c[i]<x do inc(i);
54                      while c[j]>x do dec(j);
55                      if i<=j then
56                         begin
57                              y:=c[i];c[i]:=c[j];c[j]:=y;
58                              inc(i);dec(j);
59                         end;
60                until i>j;
61                if i<r then sort(i,r);
62                if l<j then sort(l,j);
63           end;
64 begin
65      readln(n);c[0]:=0;
66      for i:=1 to n do a[i]:=nil;
67      for i:=1 to n-1 do
68          begin
69               readln(j,k);
70               add(j,k);add(k,j);
71          end;
72      dfs(0,1);sort(1,c[0]);
73      for i:=1 to c[0] do writeln(c[i]);
74      readln;
75 end.   
时间: 2024-10-14 19:39:34

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

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

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

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),只能把空闲的奶牛安排出来值班.而且,每个时间段必需有奶牛在值班.  那么,最少需要动用多少奶牛参与值班呢?如果没有办法安排出合理的

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

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

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).农夫约翰吝啬得很,他希望建设费用最少甚至他都不想给贝茜工钱. 

BZOJ3390: [Usaco2004 Dec]Bad Cowtractors牛的报复

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