危险计算机

Description
N台计算机由N-1条网线连接,形成了一个树形网络。这些计算机经常会被黑客攻击,如果这个树形网络中的某一台计算机遭到攻击而导致系统瘫痪,那么与这台计算机连接的所有网线就无法进行数据传输,整个网络就会被分成若干个小的树形网络,每个小网络由一台或多台计算机组成。如果一台计算机被攻击后,形成的每个小网络中包含的计算机数都不超过N/2,那么这台计算机就会成为重点攻击对象,称作“危险计算机”。给定一个树形网络,请你找出网络中所有的“危险计算机”。

Input
第一行是一个整数N(1≤N ≤20000),表示计算机的台数,计算机被编号为1..N。下面N-1行,每行包括两个整数X, Y,表示X和Y这两台计算机之间由一条网线连接。

Output
包括若干行,每行为一台危险计算机的编号,按升序排列。如果没有危险计算机,就输出一行,只包含一个字符串“NONE”(不包括引号)

Sample Input
10
1 2
2 3
3 4
4 5
6 7
7 8
8 9
9 10
3 8

Sample Output
3
8

HINT
tree dp

题解
三倍经验题之一(另外两道请戳这里和这里)
非常简单的tree dp
其实只要记录一个size数组(记录以每个节点为根的子树的大小)即可
dfs一下搜,到一个节点,枚举其子节点的大小和总大小减去当前节点大小的差即可

代码

#include <cstdio>

const int maxn=20000;

int n,i,x,y,tot,fl;
int size[maxn+10],pre[maxn*2+10],now[maxn+10],son[maxn*2+10],list[maxn+10],z[maxn+10];
int f[maxn+10][2],g[maxn+10][2];

int dfs(int u,int fa)
{
    z[u]=1;
    size[u]=1;
    int j=now[u];
    int flag=1;
    while (j!=0)
    {
        if (son[j]==fa)
        {
            j=pre[j];
            continue;
        }
        dfs(son[j],u);  
        size[u]+=size[son[j]];  
        if (size[son[j]]>n/2)
        {
            flag=0;
        }
        j=pre[j];
    }
    if (n-size[u]>n/2)
    {
        flag=0;
    }
    if (flag)
    {
        list[u]=1;
    }
    return size[u];
}

int main()
{
    scanf("%d",&n);
    for (i=1;i<=n-1;i++)
    {
        scanf("%d%d",&x,&y);
        tot++;
        pre[tot]=now[x];
        now[x]=tot;
        son[tot]=y;
        tot++;
        pre[tot]=now[y];
        now[y]=tot;
        son[tot]=x;
    }
    dfs(1,0);
    for (i=1;i<=n;i++)
    {
        if (list[i]==1)
        {
            printf("%d",i);
            fl=1;
        }
    }
    if (!fl)
    {
        printf("NONE\n");
    }
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值