标签:des style blog io ar color os sp for
Description
Input
Output
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
Hint
If barn 3 or barn 8 is removed, then the remaining network will have one piece consisting of 5 barns and two pieces containing 2 barns. If any other barn is removed then at least one of the remaining pieces has size at least 6 (which is more than half of the original number of barns, 5).
DFS建树,对于某一个点有dp[x]代表包括x在内的点的子树点的个数。
若符合条件有:对于x的子节点y:dp[y]<=n/2而且其余点n-dp[x]<=n/2;
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> typedef long long LL; using namespace std; #define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i ) #define REP( i , n ) for ( int i = 0 ; i < n ; ++ i ) #define CLEAR( a , x ) memset ( a , x , sizeof a ) const int maxn=10000+100; int res[maxn],dp[maxn],vis[maxn]; vector<int>v[maxn]; int n,temp,h; int dfs(int x) { if(dp[x]>0) return dp[x]; dp[x]=1; vis[x]=1; int flag=1; REP(i,v[x].size()) { int y=v[x][i]; if(vis[y]) continue; if(dfs(y)>h) flag=0; dp[x]+=dfs(y); } if(flag&&n-dp[x]<=h) res[x]=1; return dp[x]; } int main() { int x,y; std::ios::sync_with_stdio(false); while(cin>>n) { REPF(i,1,n) v[i].clear(); REP(i,n-1) { cin>>x>>y; v[x].push_back(y); v[y].push_back(x); } CLEAR(vis,0); CLEAR(res,0); h=n/2; vis[1]=1; int tt=dfs(1); REPF(i,1,n) if(res[i]) cout<<i<<endl; } return 0; }
标签:des style blog io ar color os sp for
原文地址:http://blog.csdn.net/u013582254/article/details/41412539