【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=3391

 

【题目大意】

  给定一棵树,求分支size均不大于一半点数的点

 

【题解】

  递归的同时计算各个分支size,如果出现大于一半点数的则给这个点打上标记
  最后输出没有标记的点即可。

 

【代码】

#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int N=10010;
int size[N],mark[N],n;
vector<int> v[N];
void dfs(int x,int fx){
    size[x]=1,mark[x]=1;
    for(int i=0;i<v[x].size();i++){
        int y=v[x][i];
        if(y!=fx){
            dfs(y,x);
            if(size[y]*2>n)mark[x]=0;
            size[x]+=size[y];
        }
    }if((n-size[x])*2>n)mark[x]=0;
}
int main(){
    while(~scanf("%d",&n)){
        for(int i=1;i<n;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            v[x].push_back(y);
            v[y].push_back(x);
        }dfs(1,0);
        int flag=1;
        for(int i=1;i<=n;i++)if(mark[i]){printf("%d\n",i);flag=0;}
        if(flag)puts("NONE");
    }return 0;
}

相关文章:

  • 2021-09-02
  • 2021-10-06
  • 2021-09-07
  • 2022-02-10
  • 2022-12-23
  • 2021-05-26
  • 2021-07-20
  • 2021-05-20
猜你喜欢
  • 2022-03-02
  • 2021-09-25
  • 2021-11-23
  • 2021-10-23
  • 2022-03-02
  • 2022-12-23
  • 2021-10-05
相关资源
相似解决方案