危险计算机
来源:互联网 发布:九章算法强化班 视频 编辑:程序博客网 时间:2024/04/30 07:59
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 0
- 危险计算机
- 史上五大最危险计算机黑客出炉
- 危险
- 危险
- 危险
- 危险
- 危险
- 危险
- 危险
- 危险
- 危险
- 危险
- 危险
- 危险
- 危险
- 危险
- 危险
- 史上五大最危险计算机黑客出炉 多数有犯罪前科
- Android之Bitmap二次采样 (压缩)
- k近邻算法
- bzoj1821部落划分
- Glide使用详解(一)
- 这是我的第一个博客有关javascrit的
- 危险计算机
- static和final可以修饰的对象和其特征
- 前端自动化测试之chai.js断言库
- poj 3111 K Best(二分-最大化平均值)
- java同步基石AQS
- LSTM
- 字符串相关,字符串结束符,sprintf_s
- POJ 2785 4 Values whose Sum is 0 <二分>
- ES6