【模拟+set】k层数找根 Codeforces 1067B Multihedgehog

http://codeforces.com/problemset/problem/1067/B

题意:

1-刺猬图满足:

是一棵树
    存在一个中心节点u与其它所有点相连
    每个中心节点,至少与3个节点相连
2-刺猬图满足:

是一棵树
    存在一个中心节点u与其它所有1-刺猬图的中心节点相连
    这个中心节点至少连接3个以上的1-刺猬图
    k-刺猬图依次类推,给你一棵树,问你它是不是k-刺猬图!

给你 n,k

问你是否能建出树来

一层一层把最外面度数为1的节点去掉,然后看去掉节点的另一端度数是否是>=3

看删完k层后是否还留下且只留下一个度数>=3的点

wa在122组神仙样例!!!

看代码吧

还要记得每次删完v后,剩下的u是只跟一个点连的

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int from[maxn],to[maxn],vis[maxn],du[maxn];

int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=1;i<n;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        from[i]=u,to[i]=v;
        du[u]++,du[v]++;
    }

    if(n<=3||k>12)
    {
        printf("No\n");
        return 0;
    }

    set <int> s;
    int num=0,f;
    for(int i=1;i<=k;i++)
    {
        for(int j=1;j<n;j++)
        {
            if(du[from[j]]==0||du[to[j]]==0) continue;
            if(du[from[j]]==1)
            {
                s.insert(to[j]);
                vis[to[j]]++;
                du[from[j]]--;
                num++;
            }
            else if(du[to[j]]==1)
            {
                s.insert(from[j]);
                vis[from[j]]++;
                du[to[j]]--;
                num++;
            }
        }

        for(auto x:s)
        {
            f=x;
            if(i==k) continue;
            if(du[x]>3&&du[x]-vis[x]==1)
            {
                du[x]=1;
            }
            else
            {
                printf("No\n");
                return 0;
            }
        }
        s.clear();
        if(i==k&&num==n-1&&du[f]>=3)
        {
            printf("Yes\n");
            return 0;
        }
    }
    
    printf("No\n");

    return 0;
}

/*
21 2
3 1
4 1
5 1
6 2
7 2
8 2
1 2
9 1
9 10
9 11
9 12
10 13
10 14
10 15
11 16
11 17
11 18
12 19
12 20
12 21
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值