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

来源:互联网 发布:spinner控件绑定数据 编辑:程序博客网 时间:2024/05/29 15:29

→题目链接←


【想说的话】

果然我还是比较喜欢树


【题解】

dfs一遍计算出以1为根,每个点的子树节点和,最大的子树节点数

然后1到n扫一遍,注意由那个点的父亲组成的子树,n-sum[x]就行了


【代码】

#include<bits/stdc++.h>#define MAXN 10010typedef long long ll;using namespace std;inline int rd(){int x=0,y=1;char c=getchar();while(c<'0' || c>'9'){if(c=='-')y=-y;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*y;}int n;vector<int>v[MAXN];int sum[MAXN],Max[MAXN];void dfs(int x,int fa){sum[x]=1;for(int i=0; i<v[x].size(); i++){int to=v[x][i];if(to==fa)continue;dfs(to,x);sum[x]+=sum[to];Max[x]=max(Max[x],sum[to]);}}int main(){n=rd();for(int i=1; i<n; i++){int x=rd(),y=rd();v[x].push_back(y);v[y].push_back(x);}dfs(1,0);bool f=false;for(int i=1; i<=n; i++){if(max(Max[i],n-sum[i])<=n/2){f=true;printf("%d\n",i);}}if(!f)puts("NONE");return 0;}