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

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

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 47  Solved: 37
[Submit][Status]

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 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<iostream>
 7 #include<vector>
 8 #include<map>
 9 #include<set>
10 #include<queue>
11 #include<string>
12 #define inf 1000000000
13 #define maxn 10000+10
14 #define maxm 500+100
15 #define eps 1e-10
16 #define ll long long
17 #define pa pair<int,int>
18 #define for0(i,n) for(int i=0;i<=(n);i++)
19 #define for1(i,n) for(int i=1;i<=(n);i++)
20 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
21 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
22 #define mod 1000000007
23 using namespace std;
24 inline int read()
25 {
26     int x=0,f=1;char ch=getchar();
27     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
28     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
29     return x*f;
30 }
31 int n,tot,head[maxn],a[maxn],f[maxn],s[maxn];
32 bool v[maxn];
33 struct edge{int go,next;}e[2*maxn];
34 inline void insert(int x,int y)
35 {
36     e[++tot].go=y;e[tot].next=head[x];head[x]=tot;
37     e[++tot].go=x;e[tot].next=head[y];head[y]=tot;
38 }
39 void dfs(int x)
40 {
41     v[x]=1;f[x]=0;s[x]=1;
42     for(int i=head[x],y;i;i=e[i].next)
43      if(!v[y=e[i].go])
44       {
45           dfs(y);
46           s[x]+=s[y];
47           f[x]=max(f[x],s[y]);
48       }
49     f[x]=max(f[x],n-s[x]);
50     if(f[x]<=n/2)a[++a[0]]=x;
51 }
52 int main()
53 {
54     freopen("input.txt","r",stdin);
55     freopen("output.txt","w",stdout);
56     n=read();
57     for1(i,n-1)insert(read(),read());
58     dfs(1);
59     if(!a[0]){printf("NONE");return 0;}
60     sort(a+1,a+a[0]+1);
61     for1(i,a[0])printf("%d\n",a[i]);
62     return 0; 
63 }
View Code

 

posted @ 2014-10-04 00:32  ZYF-ZYF  Views(197)  Comments(0Edit  收藏  举报