• Justified Jungle


    Problem J: Justified Jungle

    Time limit: 6 s Memory l

    imit: 512 MiB

    As you probably know, a tree is a graph consisting of n nodes and n−1 undirected edges in which any two nodes are connected by exactly one path. A forest is a graph consisting of one or more trees. In other words, a graph is a forest if every connected component is a tree. A forest is justified if all connected components have the same number of nodes. Given a tree G consisting of n nodes, find all positive integers k such that a justified forest can be obtained by erasing exactly k edges from G. Note that erasing an edge never erases any nodes. In particular when we erase all n−1 edges from G, we obtain a justified forest consisting of n one-node components.
    Input The first line contains an integer n (2≤ n ≤1000000) — the number of nodes in G. The k-th of the following n−1 lines contains two different integers ak and bk (1≤ ak,bk ≤n) — the endpoints of the k-th edge.
    Output
    The first line should contain all wanted integers k, in increasing order.
    Example
    input
    8 1 2 2 3 1 4 4 5 6 7 8 3 7 3
    output
    1 3 7
    Figures depict justified forests obtained by erasing 1, 3 and 7 edges from the tree in the example input.

     1 // 题目大意:删去k条边,树变为相等个点的连通分量,求所有正整数k。
     2 
     3 #include<bits/stdc++.h>
     4 using namespace std;
     5 typedef long long ll;
     6 #define maxn 1000006
     7 int head[maxn],cnt,siz[maxn],v[maxn],n;
     8 struct edge{
     9     int to,nxt;
    10 }e[maxn<<1];
    11 void add_edge(int u,int v){
    12     e[cnt].to=v;
    13     e[cnt].nxt=head[u];
    14     head[u]=cnt++;
    15 }
    16 void dfs(int u,int fa){
    17     siz[u]=1;
    18     for(int i=head[u];i!=-1;i=e[i].nxt){
    19         int v=e[i].to;
    20         if(v==fa) continue;
    21         dfs(v,u);
    22         siz[u]+=siz[v];
    23     }
    24     v[siz[u]]++; 
    25 }
    26 bool check(int x){
    27     x++;
    28     if(n%x) return 0;
    29     int w=n/x,sum=0;
    30     for(int i=w;i<=n;i+=w) sum+=v[i];
    31     return sum==x;
    32 }
    33 int main(){
    34     memset(head,-1,sizeof head);
    35     scanf("%d",&n);
    36     for(int i=0;i<n-1;i++){
    37         int a,b;
    38         scanf("%d%d",&a,&b);
    39         add_edge(a,b);
    40         add_edge(b,a);
    41     }
    42     dfs(1,-1);
    43     for(int i=1;i<=n;i++){
    44         if(check(i)) printf("%d ",i);
    45     }
    46     return 0;
    47 }
    抓住青春的尾巴。。。
  • 相关阅读:
    用php做了下冒泡排序
    安装xampp无法设置默认时间的坑
    PHP的静态变量和引用函数
    jquery.cookie.js 用法
    PhpStorm的open in browser怎么修改端口和相对路径
    springmvc上传图片并显示图片--支持多图片上传
    Spring MVC中处理静态资源的多种方法
    超强、超详细Redis数据库入门教程(转载)
    推荐60个jQuery插件(转)
    [Spring MVC]
  • 原文地址:https://www.cnblogs.com/xidian-mao/p/8962690.html
Copyright © 2020-2023  润新知