本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。

输入格式:
输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父/母。家谱中辈分最高的老祖宗对应的父/母编号为 -1。一行中的数字间以空格分隔。
输出格式:
首先输出最小的辈分(老祖宗的辈分为 1,以下逐级递增)。然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔,行首尾不得有多余空格

输入样例:
9
2 6 5 5 -1 5 6 4 7

输出样例:
4
1 9

我先说一下一开始超时的算法吧,用了dp的思想,降低了一些复杂度,但是,没用,依然超时。

#include <bits/stdc++.h>
using namespace std;
int a[100010],b[100010],c[100010];
int n,ma=0;
int f(int i)
{if(a[i]==-1)b[i]=1;elseb[i]=f(a[i])+1;if(b[i]>ma)ma=b[i];return b[i];
}
int main()
{int i,top=1;scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&a[i]);b[i]=0;}for(i=1;i<=n;i++){if(b[i]==0){f(i);}}printf("%d\n",ma);for(i=1;i<=n;i++){if(b[i]==ma){c[top++]=i;}}top--;for(i=1;i<top;i++)printf("%d ",c[i]);printf("%d\n",c[top]);return 0;
}

后面的代码时抄的,用的bfs,
他在一开始储存数据的方式就和我不一样。
牛呀!
原博客地址

#include <bits/stdc++.h>
using namespace std;int n,t,mx,f,lzz,bfe[100005];
vector <int> vec[100005];/*vector   动态数组。这是一个二维数组,它的第一维大小是固定的100005,第二维是动态的。vec[i].size(),返回这个以为数组的大小,即元素个数queue, 队列,queue<int>q;q.push(tiem)  把item放进队列q.front()     返回队首元素,但不会删除q.pop()       删除队首元素q.back()      返回队尾元素q.size()      返回元素个数q.empty()     检查队列是否为空*//*vec,这里用于存储它孩子的编号。bef,用于储存他自己的辈分,就是第几辈*/
void bfs(int id){bfe[id] = mx = 1;queue <int> Q;Q.push(id);while(!Q.empty()){int fnt = Q.front();Q.pop();int len=vec[fnt].size();for(int i = 0;i < len;i++){bfe[vec[fnt][i]] = bfe[fnt] + 1;mx = max(mx,bfe[vec[fnt][i]]);Q.push(vec[fnt][i]);}}return;
}int main(){scanf("%d",&n);for(int i = 1;i <= n;i++){scanf("%d",&t);if(t == -1){lzz = i;}else{vec[t].push_back(i);//在尾部添加一个数据。}}bfs(lzz);f = 0;cout << mx << endl;for(int i = 1;i <= n;i++){if(bfe[i] == mx){if(f == 0){printf("%d",i);f = 1;}else{printf(" %d",i);}}}cout << endl;return 0;
}

感谢大佬给的第一段代码修改版!

#include <bits/stdc++.h>
using namespace std;
int a[100010],b[100010],c[100010];
/*a[i],储存原始数据,即i个节点的直系祖辈。b[i],记录它是第几辈c[i],保存最小辈的编号*/
int n,ma=0;
int f(int i)
{if(b[i]!=0)return b[i];//此处做修改,函数自身调用时,没必要每次都回到调用到祖辈if(a[i]==-1)b[i]=1;elseb[i]=f(a[i])+1;if(b[i]>ma)ma=b[i];return b[i];
}int main()
{int i,top=1;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);for(i=1;i<=n;i++)if(b[i]==0)f(i);printf("%d\n",ma);for(i=1;i<=n;i++){if(b[i]==ma){c[top++]=i;}}top--;for(i=1;i<top;i++)printf("%d ",c[i]);printf("%d\n",c[top]);return 0;
}

7-10 小字辈 (25分)相关推荐

  1. 【CCCC】L2-026 小字辈 (25分),求多叉树的深度和底层叶节点

    problem L2-026 小字辈 (25分) 本题给定一个庞大家族的家谱,要请你给出最小一辈的名单. 输入格式: 输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) -- 简单起 ...

  2. 7-5 小字辈 (25 分)

    暑假字符串专题HBU程序设计训练营总结 ?点这里 7-5 小字辈 (25 分) 本题给定一个庞大家族的家谱,要请你给出最小一辈的名单. 输入格式: 输入在第一行给出家族人口总数 N(不超过 100 0 ...

  3. 7-4 小字辈 (25 分) 详解

    7-4 小字辈 (25 分) 本题给定一个庞大家族的家谱,要请你给出最小一辈的名单. 输入格式: 输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) -- 简单起见,我们把家族成员从 ...

  4. 小字辈 (25 分)

    本题给定一个庞大家族的家谱,要请你给出最小一辈的名单. 输入格式: 输入在第一行给出家族人口总数N(不超过 100 000 的正整数) -- 简单起见,我们把家族成员从 1 到N编号.随后第二行给出 ...

  5. 7-3 小字辈 (25分)

    本题给定一个庞大家族的家谱,要请你给出最小一辈的名单. 输入格式: 输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) -- 简单起见,我们把家族成员从 1 到 N 编号.随后第二行 ...

  6. L2-026 小字辈 (25 分)(深搜详解)

    本题给定一个庞大家族的家谱,要请你给出最小一辈的名单. 输入格式: 输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) -- 简单起见,我们把家族成员从 1 到 N 编号.随后第二行 ...

  7. L2-2 小字辈 (25 分)

    题目链接 深搜过程中记录最小辈分和最小成员编号 #include <algorithm> #include <bitset> #include <cmath> #i ...

  8. python 判断该地址 文件创建时间2020年10月14日14时25分32秒 文件最后一次访问时间 文件最后一次修改时间

    #1.判断该地址 #1.文件名 #2.文件路径 #3.文件扩展名 #4.文件创建时间2020年10月14日14时25分32秒 #5.文件最后一次访问时间 #6.文件最后一次修改时间 #7.文件的大小( ...

  9. PTA 03-树1 树的同构 (25分)

    题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/711 5-3 树的同构   (25分) 给定两棵树T1和T2.如果T1可以通过若干次左右 ...

最新文章

  1. 电单车拉力赛的调试情况汇集
  2. HTML为什么认为“ chucknorris”是一种颜色?
  3. Java通过JDBC连接SQL Server2017数据库
  4. ACM POJ 2723 Get Luffy Out(2-SAT入门)
  5. java heap space 解决方法_Java静态方法/变量,非静态方法/变量的区别,今天一并帮你解决
  6. html怎么查看两个块的距离,两个东西之间的距离怎么控制
  7. linux 系统迁移到固态硬盘,把Debian GNU/Linux迁移到SSD上
  8. 第5 章 引用类型2
  9. Clojure 的 Enlive 库尝试
  10. R6300V2 从 DD-WRT 回刷恢复 官方原厂固件   DD-WRT to R6300V2
  11. cad2020打印样式放在哪个文件夹_CAD批量打印、DPF合成(建议收藏)
  12. 华为静态路由配置实例
  13. 如何解决打印机卡纸问题 以HP LaserJet 5100 机型为例清除故障
  14. 微信授权就是这个原理,Spring Cloud OAuth2 授权码模式
  15. 如何进行“基于示例”的搜索
  16. ADC转换速率kSPS定义
  17. Machine learning system design - Error analysis
  18. js获取html中图片路径,用js快速的获取html页面中图片的地址
  19. linuxci‘pang磁盘管理的实验报告
  20. vim的使用以及vim插件的配置

热门文章

  1. PTA-7-24猜数字游戏,比照和分析。
  2. Discuz插件提示:对不起,您安装的不是正版应用的解决办法
  3. 带你快速了解菜品识别
  4. 微信开发上传多张图片html,微信JSSDK一次性上传多张图片卡死解决方案
  5. 双CPU与单CPU有什么区别,有什么优势?
  6. Elasticsearch文档CURD操作
  7. 【python】No such file or directory的解决方法
  8. 毕业时候写的一个PE解析小工具(MFC源码)
  9. 企业微信的聊天记录可以被领导看到吗?这样算不算被窥探隐私?
  10. 2.ZooKeeper分桶策略实现高性能的会话管理「第五章 ZooKeeper 原理」「架构之路ZooKeeper理论和实战」