cerc2017 Justified Jungle

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37109329/article/details/79963923

题意:一棵树有多少种切法使得每个分离的子树节点数相同,并输出每种方法需要切边的数目,升序输出;

首先,想要均分这个树,那么剩下的子树节点必定是总节点数的因子(根据题意,排除这个数本身);

打个表,1~1e6的数最多有240个因子,那么只需要枚举因子,给的是6s;

先转换为有根树,枚举每条边,只要这个边下的子树节点数是枚举的因子的倍数,ans++;

最后如果[n/(枚举的因子)]-1==ans,则枚举得因子合法;

因为如果恰好能够被均分,需要割的边数为[n/因子]-1;

AC代码:

#include <iostream>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
const int maxn=1e6+10;
int q,head[2*maxn],sub[maxn],vis[maxn],sto[300],k,s[300];
struct point{
    int to;
    int next;
}pt[2*maxn];
void init()
{
    q=k=0;
    memset(head,-1,sizeof(head));
    memset(vis,0,sizeof(vis));
}
void add(int u,int v)
{
    pt[q].next=head[u];
    pt[q].to=v;
    head[u]=q++;
}
int dfs(int st)
{
    vis[st]=1;
    for (int i=head[st];i!=-1;i=pt[i].next)
    {
        int to=pt[i].to;
        if (!vis[to])
        {
            sub[st]+=dfs(to);
        }
    }
    return sub[st];
}
void carry(int x)
{
    int r;
    for (int i=1;i<=sqrt(x+0.5);i++)
    {
        if (x%i==0)
        {
            r=x/i;
            if (r==i)
            sto[k++]=r;
            else
            {
                sto[k++]=i;
                sto[k++]=r;
            }
        }
    }
}
int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n,cnt,u,v,p=0;
    init();
    cin>>n;
    for (int i=1;i<=n-1;i++)
    {
        cin>>u>>v;
        add(u,v);
        add(v,u);
    }
    carry(n);
    for (int i=1;i<=n;i++)
        sub[i]=1;
    dfs(1);
//  for (int i=1;i<=n;i++)
//      cout<<i<<"*******"<<sub[i]<<endl;
    for (int i=0;i<k;i++)
    {
        cnt=0;
        for (int j=2;j<=n;j++)
        {
            if (sub[j]%sto[i]==0)
            cnt++;
        }
        if (n/sto[i]-1==cnt&&cnt!=0)
        s[p++]=(n/sto[i]-1);
    }
    sort(s,s+p);
    for (int i=0;i<p;i++)
    {
        if (i==0)
        cout<<s[i];
        else
        cout<<" "<<s[i];
    }
    cout<<endl;
    return 0;
     
}
/**************************************************************
    Problem: 5085
    User: DP43
    Language: C++
    Result: 正确
    Time:2452 ms
    Memory:56248 kb
****************************************************************/

阅读更多
想对作者说点什么?
相关热词

博主推荐

换一批

没有更多推荐了,返回首页