• Problem: 危险计算机


    Problem: 危险计算机

    Time Limit: 1 Sec Memory Limit: 128 MB

    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

    #include <cstdio>
    const int maxn=20000;
    int n,i,x,y,tot,fl,size[maxn+10],pre[maxn*2+10],now[maxn+10],son[maxn*2+10],list[maxn+10],z[maxn+10],f[maxn+10][2],g[maxn+10][2];
    void add(int x,int y){
        tot++;
        pre[tot]=now[x];
        now[x]=tot;
        son[tot]=y;
    }
    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],1))continue;
            dfs(son[j],u);
            size[u]+=size[son[j]];
            size[son[j]]>n/2?flag=0,size[son[j]]:size[son[j]];
            j=pre[j];
        }
        n-size[u]>n/2?flag=0:flag?list[u]=1:0;
        return size[u];
    }
    int main() {
        scanf("%d",&n);
        for(i=1; i<=n-1; add(x,y),add(y,x),i++) scanf("%d%d",&x,&y);
        dfs(1,0);
        for(i=1; i<=n; i++) list[i]==1?printf("%d
    ",i),fl=1:0;
        fl?0:printf("NONE
    ");
    }
    
  • 相关阅读:
    HDU 2767:Proving Equivalences(强连通)
    POJ 2828: Buy Tickets(线段树)
    HRBUST 2078:糖果(模拟,贪心)
    大视野 1016: [JSOI2008]最小生成树计数(最小生成树)
    HRBUST 2064:萌萌哒十五酱的宠物~(最近公共祖先LCA)
    HRBUST 2072:萌萌哒十五酱的礼物~(树,字典树)
    分组 F查询 Q 查询
    连表查询 复习
    django 多表操作
    orm 表单操作
  • 原文地址:https://www.cnblogs.com/ZhaoChongyan/p/11740453.html
Copyright © 2020-2023  润新知