约翰意识到贝茜建设网络花费了他巨额的经费,就把她解雇了.贝茜很愤怒,打算狠狠报
复.她打算破坏刚建成的约翰的网络. 约翰的网络是树形的,连接着N(1≤N≤10000)个牛棚.她打算切断某一个牛棚的电源,使和这个牛棚相连的所有电缆全部中断.之后,就会存在若干子网络.为保证破坏够大,每一个子网的牛棚数不得超过总牛棚数的一半,那哪些牛棚值得破坏呢?
标签:des style blog http color io os ar for
题解:
类似与找重心,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 }
BZOJ3391: [Usaco2004 Dec]Tree Cutting网络破坏
标签:des style blog http color io os ar for
原文地址:http://www.cnblogs.com/zyfzyf/p/4005528.html