题目分析:本题开始一直在考虑如何将每一个节点通过一种合适的数据结构存储起来(一对多的关系),最后发现借助并查集的思想可以用一个数组p,p[i]存放i节点的父节点,每次查询编号为i的节点属于第几层且判断是否有以该点位父元素的节点(判断该点是否为叶子节点,是则floor[对应层数]++)由于本题的图不存在环路,则借助这个p数组则能十分巧妙将整棵树存储下来,本题还借助了vis[]数组存放某个节点是否出现过(因为N个节点并不一定是有序出现的),mat数组存放下标为i时是否是叶子节点,floor[]数组i层的叶子节点的总数,本题需要额外注意的细节是:输入的N和M,M有可能是0,则由于根节点一定是1,所以第0层一定有一个叶子节点(1号节点本身),此外对于输入的每一行数据,每个节点的孩子节点数也有可能是0(0则代表是叶子节点,没有孩子节点)

 #include<iostream>
#include<string.h>
using namespace std; int vis[]; //记录i点是否是树上的节点
int floor[]; //记录每一层的叶子节点的数量 1为0层
int p[]; //记录i的父节点
int mat[]; //存储是否有以i为父节点的节点 i
int max_flo; void serach(int x){
int t = x;
int flo = ; //默认对于节点1来说属于0层
while(p[x] != x){
x = p[x];
flo++;
}
if(flo > max_flo) max_flo = flo;
if(mat[t] == ){//如果没有以这个节点为父节点的节点则代表这个节点是叶子节点 对应的层数叶节点数+1
floor[flo]++;
}
} int main(){
int n, m;
while(scanf("%d", &n) != EOF){
if(n == ) break;
scanf("%d", &m);
memset(floor, , sizeof(floor));
memset(vis, , sizeof(vis));
memset(mat, , sizeof(mat));
if(m == ) floor[]++;
max_flo = ; //初始化最深的层数
for(int i = ; i <= ; i++) p[i] = i;
for(int i = ; i <= m; i++){
int id, num;
scanf("%d%d", &id, &num);
vis[id] = ;
if(num != ) mat[id] = ;
for(int j = ; j <= num; j++){
int x;
scanf("%d", &x);
p[x] = id;
vis[x] = ;
}
}
for(int i = ; i <= ; i++){
if(vis[i] == ){ //对出现过的节点进行查询操作
serach(i);
}
}
for(int i = ; i <= max_flo; i++){
if(i != ) printf(" ");
printf("%d", floor[i]);
}
printf("\n");
}
return ;
}

PAT甲级1004题解——并查集思想改的更多相关文章

  1. PAT甲级1013题解——并查集+路径压缩

    题目分析: 本题初步浏览题目就知道是并查集的模板题,数据输入范围N为1~1000,则M的范围为0~1000^2,通过结构体记录每一对连线的关系,p[]数组记录每个节点的跟,对于k次查询,每次都要重新维 ...

  2. UVA 12232 Exclusive-OR(并查集+思想)

    题意:给你n个数,接着三种操作: I p v :告诉你 Xp = v I p q v :告诉你 Xp ^ Xq = v Q k p1 p2 … pk:问你k个数连续异或的结果 注意前两类操作可能会出现 ...

  3. PAT L2-013 红色警报(并查集求连通子图)

    战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不 ...

  4. PAT 1021 Deepest Root[并查集、dfs][难]

    1021 Deepest Root (25)(25 分) A graph which is connected and acyclic can be considered a tree. The he ...

  5. PAT 1114 Family Property[并查集][难]

    1114 Family Property(25 分) This time, you are supposed to help us collect the data for family-owned ...

  6. CodeForces 828C String Reconstruction(并查集思想)

    题意:给你n个串,给你每个串在总串中开始的每个位置,问你最小字典序总串. 思路:显然这道题有很多重复填涂的地方,那么这里的时间花费就会特别高. 我们维护一个并查集fa,用fa[i]记录从第i位置开始第 ...

  7. PAT甲级1017题解——模拟排序

    题目分析: 本题我第一次尝试去做的时候用的是优先队列,但是效率不仅代码量很大,而且还有测试样例过不去,很显然没有找到一个好的数据结构来解决这道题目(随着逐渐的刷PAT甲级的题会发现有时选择一个好的解题 ...

  8. 洛谷UVA11987Almost Union-Find题解--并查集的删除

    题目链接 https://www.luogu.org/problemnew/show/UVA11987 分析 分析下操作发现就是加了个删除操作的并查集,怎么做删除操作呢. 我们用一个\(id[]\)记 ...

  9. PAT甲级真题及训练集

    正好这个"水水"的C4来了 先把甲级刷完吧.(开玩笑-2017.3.26) 这是一套"伪题解". wacao 刚才登出账号测试一下代码链接,原来是看不到..有空 ...

随机推荐

  1. [LeetCode] 734. Sentence Similarity 句子相似度

    Given two sentences words1, words2 (each represented as an array of strings), and a list of similar ...

  2. MTCNN代码解读

    代码基于bm1682芯片 #include "mtcnn.hpp" #include "utils.hpp" using namespace std; usin ...

  3. docker搭建samba共享目录

    需求:因同事需要共享文件夹来传输数据.整好接触docker,所以想用docker来搭建samber 系统:Centos7.4 docker搭建就不在赘述,如有需要请参考:https://www.jia ...

  4. centos7安装rsync及两台机器进行文件同步

    安装及配置 yum -y install rsync #启动rsync服务 systemctl start rsyncd.service systemctl enable rsyncd.service ...

  5. mysql 多个字段的查询处理

    https://blog.csdn.net/zzzgd_666/article/details/81101548

  6. day22——从空间角度研究类、类与类之间的关系

    day22 从空间角度研究类 何处添加对象属性 在类的______init______可以添加 class Human: mind = "有思想的" def __init__(se ...

  7. JMX远程监控JVM

    远程监控JVM状态需要在JVM启动的时候需要加上一段代码开启这个功能.(以下全部以ubuntu-14-04-server.jdk1.8.tomcat7.0环境为基础) 配置的时候分两种情况:1.无需配 ...

  8. 混沌理论(Chaos theory)和非线性系统

    混沌理论(Chaos theory)是关于非线性系统在一定参数条件下展现分岔(bifurcation).周期运动与非周期运动相互纠缠,以至于通向某种非周期有序运动的理论.在耗散系统和保守系统中,混沌运 ...

  9. php数组的数学功能相关常用函数

    php数组中有一些函数与数学相关的函数,大多都是以array开头然后下划线接一个数学上的英文单词,如下: array_diff() array_diff_assoc() array_intersect ...

  10. 易百教程人工智能python修正-人工智能无监督学习(聚类)

    无监督机器学习算法没有任何监督者提供任何指导. 这就是为什么它们与真正的人工智能紧密结合的原因. 在无人监督的学习中,没有正确的答案,也没有监督者指导. 算法需要发现用于学习的有趣数据模式. 什么是聚 ...