题目地址:

https://www.acwing.com/problem/content/1193/

有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。给出每个人的孩子的信息。输出一个序列,使得每个人的孩子都比那个人后列出。

输入格式:
第 1 1 1行一个整数 n n n,表示家族的人数;接下来 n n n行,第 i i i行描述第 i i i个人的孩子;每行最后是 0 0 0表示描述完毕。每个人的编号从 1 1 1到 n n n。

输出格式:
输出一个序列,使得每个人的孩子都比那个人后列出;数据保证一定有解,如果有多解输出任意一解。

数据范围:
1 ≤ n ≤ 100 1≤n≤100 1≤n≤100

直接拓扑排序。可以用BFS,代码如下:

#include <iostream>
#include <cstring>
using namespace std;const int N = 110, M = N * N;
int n, m;
int h[N], e[M], ne[M], idx;
int q[N];
int d[N];void add(int a, int b) {e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}void topsort() {int hh = 0, tt = 0;for (int i = 1; i <= n; i++)if (!d[i])q[tt++] = i;while (hh < tt) {int t = q[hh++];for (int i = h[t]; ~i; i = ne[i]) {int v = e[i];if (--d[v] == 0) q[tt++] = v;}}
}int main() {cin >> n;memset(h, -1, sizeof h);for (int i = 1; i <= n; i++) {int s;while (cin >> s, s) {add(i, s);d[s]++;}}topsort();for (int i = 0; i < n; i++) printf("%d ", q[i]);return 0;
}

时间复杂度 O ( n m ) O(nm) O(nm),空间 O ( n ) O(n) O(n), n n n和 m m m分别是图的点数和边数。

也可以用DFS来做,一个图的后序遍历的逆序天然就是拓扑序。代码如下:

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;const int N = 110, M = N * N;
int n, m;
int h[N], e[M], ne[M], idx;
bool vis[N];
vector<int> res;void add(int a, int b) {e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}void dfs(int u) {vis[u] = true;for (int i = h[u]; ~i; i = ne[i]) {int v = e[i];if (!vis[v]) dfs(v);}res.push_back(u);
}int main() {cin >> n;memset(h, -1, sizeof h);for (int i = 1; i <= n; i++) {int s;while (cin >> s, s) add(i, s);}for (int i = 1; i <= n; i++)if (!vis[i]) dfs(i);// 要逆序输出for (int i = n - 1; i >= 0; i--)printf("%d ", res[i]);return 0;
}

时空复杂度一样。

【ACWing】1191. 家谱树相关推荐

  1. AcWing 1191. 家谱树 题解(拓扑排序)

    AcWing 1191. 家谱树 拓扑排序:建立一个队列,遍历所有点,将度数为1的点全部加入队列中,之后队内元素依次出队,对出队的点遍历所有临边,将这些临点的入度–,如果临点的入度为0,则加入队列中, ...

  2. Acwing 1191. 家谱树

    题目描述: 有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系. 给出每个人的孩子的信息. 输出一个序列,使得每个人的孩子都比那个人后列出. 输入格式 第 1 行一个整数 n,表示家族的人数: ...

  3. Acwing 1191. 家谱树 (topsort

    添加链接描述 #include<bits/stdc++.h> using namespace std; const int N=109,M=1e4+10;; int n; int h[N] ...

  4. 1191 家谱树(拓扑排序)

    1. 问题描述: 有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系.给出每个人的孩子的信息.输出一个序列,使得每个人的孩子都比那个人后列出. 输入格式 第 1 行一个整数 n,表示家族的人数: ...

  5. php递归面包屑,php可应用于面包屑导航的递归寻找家谱树实现方法

    本文实例讲述了php可应用于面包屑导航的递归寻找家谱树实现方法.分享给大家供大家参考.具体实现方法如下:<?phpecho " ";$area = array(array(& ...

  6. Php数组面包屑导航,php可应用于面包屑导航的迭代寻找家谱树实现方法

    php是通过定义类来实现迭代器接口来构造迭代器,通过yield构造迭代器可以提高性能并节省系统开销,下面就跟着爱站技术频道小编的步伐来学习php可应用于面包屑导航的迭代寻找家谱树实现方法吧. 具体实现 ...

  7. java家谱树_青锋家谱系统-基于springboot+orgtree的青锋家谱树管理系统

    gen 青锋家谱系统:基于springboot架构的家谱项目系统 项目介绍 基于springboot.orgtree的家谱树管理系统,将纸质版的家谱进行电子化.信息化,建立家族的家谱血脉联系. [青锋 ...

  8. 家谱树 (并查集拓扑排序)

    目录 拓扑排序 Kahn. 最后附上Kahn的代码: 链式前向星做法: 其次是我用Kahn做的家谱树的代码(矩阵): 其次是我用Kahn做的家谱树的代码(链式前向星): [题目描述] 有个人的家族很大 ...

  9. php子孙树,递归 迭代 得到家谱树 子孙树

    $arr=array( array('id'=>'1','name'=>'吉林','parent'=>0), array('id'=>'2','name'=>'北京',' ...

最新文章

  1. 【组队学习】【27期】Java编程语言
  2. IOS代码实现常用控件UIButton、UISlider、UISwitch、UISegmentedControl
  3. 基于firefly rk3399 Android 7.1实现的ros服务小机器人
  4. python爬虫beautifulsoup爬当当网_Python爬虫包 BeautifulSoup 递归抓取实例详解_python_脚本之家...
  5. 在食堂吃饭是最好的解
  6. ie打开完成,网页显示空白
  7. mysql数据库常用字段类型_快速了解MySQL数据库常用字段类型
  8. 学编导还是学计算机,高二学编导烧钱吗
  9. 总结 | 那些里程碑意义的深度学习目标检测论文
  10. 关于Web面试的基础知识点--Html+Css(四)
  11. python界面设计模块_Python+Pycharm+PyQT5可视化程序设计入门
  12. matlab循环码差错图样,基于循环码的差错控制编码建模与仿真1.doc
  13. JavaScript链式调用,对象属性与遍历,this指向,callee和caller
  14. MyBatis使用Mapper动态代理开发Dao层
  15. OpenGL超级宝典 纹理(一)
  16. 双稳态电路的两个稳定状态是什么_555时基电路内部结构及其工作原理
  17. vlan是什么?如何划分vlan?如何实现vlan?使用vlan的优点!
  18. 当私域逐渐摆烂--伟大航路战略咨询
  19. SSD: Single Shot MultiBox Detector 之再阅读
  20. sscanf小技巧-洛谷P7911 网络连接

热门文章

  1. mysql webhook_webhook功能概述
  2. 如何解锁get一份哲哲的文件材料超详细家庭版
  3. 恢复出厂设置在哪里?原来恢复出厂还有这些知识!
  4. 视频剪辑有这6个高清视频素材库就够了
  5. 保驾护航金三银四,附超全教程文档
  6. RLP(转发注明出处)
  7. 雪梨小白的“码绘”起步——p5.js实现心形动态图形的绘制
  8. 芯片里面100多亿个晶体管是如何安装上去的?
  9. 这个教程实在是太强悍了,大家都来一饱眼福吧
  10. 2018第九届蓝桥杯Java C组 省赛真题