zoukankan      html  css  js  c++  java
  • 树上dfs+思维

     

     1 #include<cstdio>
     2 const int N=1000010;
     3 int cnt,head[N],n;
     4 int size[N],num[N];
     5 void init()
     6 {
     7     cnt  = 0;
     8     for(int i =0;i<N;i++) head[i]=-1;
     9 }
    10 struct Node{
    11     int fr,to,nex;
    12 }e[N<<1];//乘2
    13 void add(int x,int y){
    14     e[cnt].fr=x;e[cnt].to=y;
    15     e[cnt].nex=head[x];head[x]=cnt++;
    16 }
    17 void dfs(int x,int rt){
    18     size[x] =1;
    19     for(int i =head[x];i!=-1;i=e[i].nex){
    20         int v= e[i].to;
    21         if(v!=rt){
    22             dfs(v,x);
    23             size[x]+=size[v];
    24         }
    25     }
    26     num[size[x]]++;
    27 }
    28 int x,y;
    29 bool check(int i)
    30 {
    31     i++;//子树数目
    32     if(n%i) return false;//无法均分
    33     int tmp = n/i;//每个子树大小
    34     int sum=0;
    35     for(int i=tmp;i<=n;i+=tmp) sum+=num[i];//找子树大小为tmp的子树数目
    36     //tmp  2*tmp  3*tmp  其实都是再找tmp
    37     return sum==i;
    38 }
    39 int main()
    40 {
    41     //freopen("1.txt","r",stdin);
    42     init();
    43     scanf("%d",&n);
    44     for(int i =0;i<n-1;i++) {
    45         scanf("%d%d",&x,&y);
    46         add(x,y);add(y,x);//无向边
    47     }
    48     dfs(1,0);//1不一定是根节点dfs(n-1,0)都可以。
    49     for(int i=1;i<n;i++){
    50         //printf("%d......",i);
    51         if(check(i)) printf("%d ",i);
    52     }
    53     return 0;
    54 }
  • 相关阅读:
    CSU-ACM2020寒假集训比赛2
    js动画(一)
    响应式基本知识
    移动web基本知识
    premere cs4绿色版 安装 并且 视频导出 讲解
    样式重置
    html5图片标签与属性
    我眼中的科研
    Chrome浏览器上无法使用西瓜影音???
    双系统引导菜单设置
  • 原文地址:https://www.cnblogs.com/tingtin/p/10668177.html
Copyright © 2011-2022 走看看