首页 > 代码库 > BZOJ3391: [Usaco2004 Dec]Tree Cutting网络破坏

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 100000000013 #define maxn 10000+1014 #define maxm 500+10015 #define eps 1e-1016 #define ll long long17 #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 100000000723 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

 

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