python实现--拓扑排序

拓扑排序是对有向无环图(DAG)进行排序的一种算法,它可以将图中的顶点排成一个线性序列,使得图中的任意一条有向边都从序列中的较早顶点指向较晚顶点。换句话说,如果图中存在一条从顶点A到顶点B的有向边,那么在拓扑排序中顶点A一定出现在顶点B之前。

统计入度:
对图中的每个顶点,统计其入度,即指向它的边的数量。
初始化:
将入度为0的顶点加入一个队列,作为初始节点。
拓扑排序:
1.从队列中取出一个顶点,并输出。
2.将该顶点的所有邻接顶点的入度减1。
3.如果某个邻接顶点的入度减为0,则将其加入队列。
4.重复步骤3,直到队列为空。
检查:
如果输出的顶点数等于图中的顶点数,则拓扑排序成功,否则图中存在环。
假设有以下有向图:

 1  →  2  →  4↓  ↗ ↓  ↗ ↓3    5  →  6

首先统计每个顶点的入度:
1号顶点入度为0
2号顶点入度为1
3号顶点入度为1
4号顶点入度为1
5号顶点入度为2
6号顶点入度为1
将入度为0的顶点加入队列:[1]

开始拓扑排序:
取出队列中的1号顶点,并输出:1
将1号顶点的邻接顶点2号和3号的入度分别减1,得到入度为0的2号和3号顶点,加入队列:[2, 3]
取出队列中的2号顶点,并输出:2
将2号顶点的邻接顶点4号的入度减1,得到入度为0的4号顶点,加入队列:[3, 4]
取出队列中的3号顶点,并输出:3
将3号顶点的邻接顶点5号的入度减1,得到入度为1的5号顶点,加入队列:[4, 5]
取出队列中的4号顶点,并输出:4
将4号顶点的邻接顶点6号的入度减1,得到入度为0的6号顶点,加入队列:[5, 6]
取出队列中的5号顶点,并输出:5
取出队列中的6号顶点,并输出:6
完成拓扑排序,输出结果为:[1, 2, 3, 4, 5, 6]。

from collections import defaultdict, dequedef topological_sort(graph):# 统计入度indegree = defaultdict(int)for node in graph:for neighbor in graph[node]:indegree[neighbor] += 1# 将入度为0的节点加入队列queue = deque([node for node in graph if indegree[node] == 0])result = []# 拓扑排序while queue:node = queue.popleft()result.append(node)# 将该节点的邻接节点的入度减1,并将入度为0的节点加入队列for neighbor in graph[node]:indegree[neighbor] -= 1if indegree[neighbor] == 0:queue.append(neighbor)# 如果结果中的节点数等于图中的节点数,则拓扑排序成功if len(result) == len(graph):return resultelse:return None# 测试
graph = {'1': ['2', '3'],'2': ['4', '5'],'3': ['5'],'4': ['6'],'5': ['6'],'6': []
}sorted_nodes = topological_sort(graph)
if sorted_nodes:print("拓扑排序结果:", sorted_nodes)
else:print("图中存在环,无法进行拓扑排序")

统计入度:
遍历图中的每个节点,统计每个节点的入度,即指向该节点的边的数量。
初始化:
将入度为0的节点加入一个队列,作为拓扑排序的初始节点。
拓扑排序:
1.从队列中取出一个节点,并输出到结果列表中。
2.将该节点的所有邻接节点的入度减1。
3.如果某个邻接节点的入度减为0,则将其加入队列。
4.重复上述步骤直到队列为空。
检查:
如果结果列表中的节点数等于图中的节点数,则拓扑排序成功,否则图中存在环。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/757716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android分区存储到底该怎么做

文章目录 一、Android存储结构二、什么是分区存储?三、私有目录和公有目录三、存储权限和分区存储有什么关系?四、我们应该该怎么做适配?4.1、利用File进行操作4.2、使用MediaStore操作数据库 一、Android存储结构 Android存储分为内部存储和…

【逆向】使用 Frida 进行 Android 应用程序动态分析与加密算法逆向

不愿染是与非 怎料事与愿违 心中的花枯萎 时光它去不回 回忆辗转来回 痛不过这心扉 愿只愿余生无悔 随花香远飞 🎵 毛不易《不染》 在移动应用程序开发中,保护用户数据的安全至关重要。加密算法是保护数据安全的重要手段之一。然而…

【晴问算法】提高篇—动态规划专题—最长上升子序列

题目描述 现有一个整数序列a1,a2,...,an​​​​​​,求最长的子序列(可以不连续),使得这个子序列中的元素是非递减的。输出该最大长度。 输入描述 第一行一个正整数n(1≤n≤100​​​​),表示序…

【进阶版讲解深度学习如何入门?】

深度学习如何入门? 1. 前言2. 学习基础知识3. 了解机器学习4. 编程和工具5. 深度学习基础6. 实战项目7. 高级概念8. 持续学习9. 推荐资源 1. 前言 深度学习是机器学习的一个子领域,它受到了生物神经网络的启发,依赖于构建多层的神经网络来学…

Windows 11 安装 Scoop

[Windows 11 安装 Scoop](Windows 11 安装 Scoop) 0. 引言 Scoop 从命令行安装您熟悉和喜爱的程序,差异最小。 它的主要功能如下: 消除权限弹出窗口 隐藏 GUI 向导样式的安装程序 防止PATH污染安装大量程序 避免安装和卸载程序的意外副作用 自动查…

算法-背包问题

问题描述 假设我有一个背包,希望在装得下的情况下,尽量装进价值更多的物品。那么我该怎么做呢? 问题抽象 假设背包的容量是m,就假设是4吧 # 表示背包容量4KG m 4 可选装进背包的物品有n个,物品的价值存储在prices…

支付宝手机网站支付,微信扫描二维码支付

支付宝手机网站支付 支付宝文档 响应示例 <form name"punchout_form" method"post" action"https://openapi.alipay.com/gateway.do?charsetUTF-8&methodalipay.trade.wap.pay&formatjson&signERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE…

Maven打包时报错:Cannot allocate memory

使用Jenkins执行Maven打包任务时报错 Cannot allocate memory解决办法&#xff1a; 配置系统变量 MAVEN_OPTS-Xmx256m -XX:MaxPermSize512m或者 在项目目录下新建文件 .mvn/jvm.config -Xmx256m -Xms256m -XX:MaxPermSize512m -Djava.awt.headlesstrue参考 Jenkins Maven …

MySQL 数据库设计范式

第一范式&#xff08;1NF&#xff09; 每一列都是不可分割的原子数据项第二范式&#xff08;2NF&#xff09; 在1NF的基础上&#xff0c;非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖) 1.函数依赖A->B&#xff0c;如果通过A属性(属性组)的值…

Transformer学习【从零理解】

Transformer 一、整体框架 二、Encoder 1.输入部分: &#xff08;1&#xff09;Embedding&#xff1a;将输入的词转换为对应的词向量。 &#xff08;2&#xff09;位置编码&#xff1a;因为保证输出时&#xff0c;顺序不会打乱&#xff0c;所以要加入时序信息即位置编码。 公…

如何避免AI网红经济泡沫?警惕细分行业的AI转型而不是转行

一、AI泡沫预防针 要避免AI相关新概念催生的网红经济泡沫&#xff0c;可以从多个角度采取措施&#xff1a; 1. **理性投资**&#xff1a; - 投资者应对AI项目和网红经济中的企业进行深入研究&#xff0c;了解其真实的技术实力、商业模式的可行性和盈利能力&#xff0c;而非…

代码随想录Day52:最长递增子序列、最长连续递增序列、最长重复子数组

最长递增子序列 class Solution { public:int lengthOfLIS(vector<int>& nums) {if(nums.size() < 1) return nums.size();vector<int> dp(nums.size(), 1);int res 0;for(int i 1; i < nums.size(); i){for(int j 0; j < i; j){if(nums[i] > …

初识GO语言

是由google公司推出的一门编程语言&#xff0c;12年推出的第一个版本 Go的特点 Go为什么能在最近的IT领域炙手可热 集python简洁&C语言的性能于一身 21世纪的C语言 顺应容器化时代的到来 区块链的崛起 学习一门编程语言可以划分为下面这三个步骤 安装 编译器 or 解…

JAVA多线程之synchronized锁

文章目录 1. 临界区2. synchronized使用2.1 不加锁实现2.2 synchronized加锁2.3 面向对象的改进2.4 方法上加synchronized2.5 线程安全 3. Monitor3.1 Java对象头3.2 Monitor工作流程3.3 字节码角度 4. synchronized原理4.1 轻量级锁4.2 锁膨胀4.3 偏向锁4.3.1 偏向锁过程4.3.2…

【链表】Leetcode 2. 两数相加【中等】

两数相加 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c; 并且每个节点只能存储 一位 数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外&#xff0c;这两个数都不…

Redis数据结构对象中的对象共享、对象的空转时长

对象共享 概述 除了用于实现引用计数内存回收机制之外&#xff0c;对象的引用计数属性还带有对象共享的作用。 在Redis中&#xff0c;让多个键共享同一个值对象需要执行以下两个步骤: 1.将数据库键的值指针指向一个现有的值对象2.将被共享的值对象的引用计数增一 目前来说…

pytorch 实现线性回归(Pytorch 03)

一 从零实现线性回归 1.1 生成训练数据 原始 计算公式&#xff0c; 我们先使用该公式生成一批数据&#xff0c;然后使用 结果数据去计算 计算 w1, w2 和 b。 %matplotlib inline import random import torch from d2l import torch as d2ldef synthetic_data(w, b, num_ex…

敏捷开发最佳实践:质量维度实践案例之接口级自动化测试

本次分享我们将继续给大家带来全新的质量维度实践案例&#xff1a;接口级自动化测试。 本实践节选自《2022中国企业敏捷实践白皮书》&#xff0c;分享者为查俊&#xff0c;是来自腾讯的高级研发项目经理。 问题&#xff1a; 版本持续迭代&#xff0c;关键路径上的场景持续增…

C#面:简述 var 和 dynamic

var 关键字&#xff1a; var 关键字是在编译时进行类型推断的。也就是说&#xff0c;编译器会根据变量的初始化表达式来确定变量的类型&#xff0c;并在编译时将其替换为实际的类型。var 关键字只能用于局部变量&#xff0c;不能用于字段、方法参数或返回类型。var 关键字声明…

基于springboot+vue的餐饮管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…