1191 家谱树(拓扑排序)

1191 家谱树(拓扑排序)1 问题描述 有个人的家族很大 辈分关系很混乱 请你帮整理一下这种关系 给出每个人的孩子的信息 输出一个序列 使得每个人的孩子都比那个人后列出 输入格式第 1 行一个整数 n 表示家族的人数 接下来 n 行 第 i 行描述第 i 个人的孩子 每行最后是 0 表示描述完毕 每个人的编号从 1 到 n 输出格式输出一个序列 使得每个人的孩子都比那个人后列出 数据保证一定有解 如果有多解输出任意一解 数据范围 1 n 100 输入样例

1. 问题描述:

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

输入格式

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

输出格式

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

数据范围

1 ≤ n ≤ 100

输入样例:

输出样例:

2. 思路分析:

分析题目可以知道我们可以将每一个人看成是一个节点,本质上求解的是拓扑排序的序列,拓扑排序是对于有向图来说的,使得每一条边都是前面的节点指向后面的节点,当存在环的时候是没有拓扑排序的,如果一个有向图可以拓扑排序那么这个图称为拓扑图,拓扑图等价于有向无环图。算法流程:

  • 遍历每一条边的时候统计节点的入度;
  • 将所有入度为0的点入队,当队列非空的时候执行循环,弹出队头元素,遍历队头元素的所有出边,将出边对应的节点的入度减1,如果发现度数为0之后那么将其加入到队列中,并且所有度数为0的节点都是拓扑排序的序列。

3. 代码如下:

import collections from typing import List class Solution: def topsort(self, n: int, d: List[int], g: List[List[int]], res: List[int]): q = collections.deque() for i in range(1, n + 1): # 将入度为0的点入队 if d[i] == 0: q.append(i) res.append(i) while q: # 弹出队首节点 p = q.popleft() # 遍历p的所有邻接点 for next in g[p]: # 对应的入度减1 d[next] -= 1 # 入度为0之后将当前节点加入到队列中 if d[next] == 0: q.append(next) # 拓扑排序的序列中加入当前的节点next res.append(next) def process(self): n = int(input()) # 邻接表 g = [list() for i in range(n + 10)] d = [0] * (n + 10) for i in range(1, n + 1): s = input() # 当len(s) == 1的时候说明没有孩子 if len(s) > 1: s = s.split() for j in range(len(s) - 1): t = int(s[j]) g[i].append(t) d[t] += 1 res = list() # 拓扑排序 self.topsort(n, d, g, res) for x in res: print(x, end=" ") if __name__ == "__main__": Solution().process()
from typing import List import collections class Solution: def process(self): n = int(input()) g = [list() for i in range(n + 10)] # d用来统计入度 d = [0] * (n + 10) for i in range(1, n + 1): s = input().split() if len(s) > 1: for j in range(len(s) - 1): t = int(s[j]) g[i].append(t) d[t] += 1 res = list() self.topsort(n, d, g, res) for x in res: print(x, end=" ") def topsort(self, n: int, d: List[int], g: List[List[int]], res: List[int]): q = collections.deque() for i in range(1, n + 1): if d[i] == 0: q.append(i) while q: p = q.popleft() # 每一个弹出来的节点都是入度为0的点为拓扑排序的序列 res.append(p) for next in g[p]: d[next] -= 1 if d[next] == 0: q.append(next) if __name__ == "__main__": Solution().process()
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232829.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • atm异步传输模式特性_ATM是什么模式

    atm异步传输模式特性_ATM是什么模式AsynchronousTransferMode.  ATM是一种传输模式,在这一模式中,信息被组织成信元,因包含来自某用户信息的各个信元不需要周期性出现,这种传输模式是异步的。   ATM是网络新技术,它采用基于信元的异步传输模式和虚电路结构,根本上解决了多媒体的实时性及带宽问题。实现面向虚链路的点到点传输,它通常提供155Mbps的带宽。它既汲取了话务通讯中电路交换的“有连接”服务

    2022年9月21日
    3
  • Linux命令-1:tail命令详解

    Linux命令-1:tail命令详解由于测试过程中经常需要实时查看Tomcat日志,所以要掌握tail命令的用法。将平时用到的在此记录汇总一下。实时打印文件内容tail-ffilename显示文件的最后10行tailfilename显示文件最后20行tail-n20filename显示文件从第10行开始以后的内容tail-n+10filename显示文件最后10个字符…

    2022年6月3日
    62
  • idea2021.5.1激活码【注册码】

    idea2021.5.1激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    52
  • 软阈值(Soft Thresholding)函数解读「建议收藏」

    软阈值(Soft Thresholding)函数解读「建议收藏」题目:软阈值(SoftThresholding)函数解读1、软阈值(SoftThresholding)函数的符号    软阈值(SoftThresholding)目前非常常见,文献【1】【2】最早提出了这个概念。软阈值公式的表达方式归纳起来常见的有三种,以下是各文献中的软阈值定义符号:文献【1】式(12):文献【2】:文献【3】:文献【4】

    2022年4月28日
    40
  • anaconda3如何卸载干净「建议收藏」

    anaconda3如何卸载干净「建议收藏」最近跑代码的时候老出现各种错误,因为之前卸载过一次anaconda,所以猜测可能是没有卸载干净,所以又重新卸载了一遍,为了防止再次出现卸载不干净的情况,找了很久,终于从官网上找到了能够卸载干净的方法。安装Anaconda-Cleanpackage 打开AnacondaPrompt,输入命令行: condainstallanaconda-clean 接着输入命令行进行卸载…

    2022年6月29日
    297
  • MacBookPro连上WiFi,但是没有网络解决方法

    MacBookPro连上WiFi,但是没有网络解决方法MacbookPro网络

    2022年6月29日
    72

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号