poj 2378 水题

要求去掉树中的一个点,使得分开的连通块中不存在总点数大于n/2的块

直接dfs记录u节点下总共有几个儿子即可,水

View Code
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int maxn = 10010;
vector<int> edge[maxn];
int sum[maxn],ans[maxn],n;
void dfs(int u,int fa){
sum[u]=1;
int i,j;
bool flag=true;
for(i=0;i<edge[u].size();i++){
int to=edge[u][i];
if(to==fa) continue ;
dfs(to,u);
if(sum[to]>n/2) flag=false;
sum[u]+=sum[to];
}
if(flag&&n-sum[u]<=n/2) ans[u]=true;
}
int main(){
int i,a,b;
while(scanf("%d",&n)!=EOF){
memset(ans,0,sizeof(ans));
for(i=0;i<=n;i++) edge[i].clear();
for(i=0;i<n-1;i++){
scanf("%d%d",&a,&b);
edge[a].push_back(b);
edge[b].push_back(a);
}
dfs(1,0);
for(i=1;i<=n;i++){
if(ans[i])
printf("%d\n",i);
}
puts("");
}
return 0;
}



posted @ 2012-04-08 19:44  Because Of You  Views(226)  Comments(0Edit  收藏  举报