1 条题解
-
0
C++ :
#include <bits/stdc++.h> using namespace std; const int N = 100010; //si:每个结点对应子树的大小 int pre[N],k,si[N]; int fa[N];//每个结点的父元素 struct node{ int from,to,next; }a[N*2]; bool f[N]; int n,ans = INT_MAX; //求每个结点所对应子树大小 int dfs(int x){ si[x] = 1; f[x] = true;//走过标记 //x能去的点 for(int i = pre[x];i != 0;i = a[i].next){ //没走过 if(!f[a[i].to]){ fa[a[i].to] = x;//标记父元素 si[x] += dfs(a[i].to);//子树的大小 } } return si[x]; } void add(int u,int v){ k++; a[k].from = u; a[k].to = v; a[k].next = pre[u]; pre[u] = k; } //检验每个点是否是重心 bool check(int x){ if(n-si[x]>n/2) return 0; //当前点能去的点,也就是当前点的子树 for(int i = pre[x];i != 0;i = a[i].next){ //如果该点是合法的点 if(fa[a[i].to]==x && (si[a[i].to] > n / 2)){ return 0; } } return 1; } int main(){ cin>>n; int x,y; for(int i = 1;i <= n - 1;i++){ cin>>x>>y; add(x,y); add(y,x); } //求每个结点的子结点的数量 dfs(1); //输出重心 for(int i = 1;i <= n;i++){ if(check(i)) cout<<i<<" "; } }
- 1
信息
- ID
- 1075
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者