首页 > 代码库 > BZOJ3391: [Usaco2004 Dec]Tree Cutting网络破坏
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
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 }
BZOJ3391: [Usaco2004 Dec]Tree Cutting网络破坏
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。