BZOJ3391: [Usaco2004 Dec]Tree Cutting网络破坏
3391: [Usaco2004 Dec]Tree Cutting网络破坏
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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
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的.
来源信息
8
如果牛棚3或牛棚8被破坏,剩下的三个子网节点数将是5,2,2,没有超过5的.
来源信息
HINT
Source
题解:
类似与找重心,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 }