标签: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