Python实现拓扑算法的示例
作者:福州司马懿 发布时间:2023-12-09 15:06:29
标签:Python,拓扑算法
前言
拓扑排序是图论中一种重要的排序算法,用于对有向无环图(DAG)进行排序。在拓扑排序中,图的顶点表示任务,有向边表示任务之间的依赖关系。拓扑排序算法可以找到一种满足所有任务依赖关系的顺序。
算法原理
拓扑排序算法的基本原理如下:
创建一个空的排序结果列表。
找到图中所有入度为0的顶点(即没有依赖关系的顶点),将其加入排序结果列表。
移除该顶点以及与其相关的边。
重复步骤2和3,直到图中的所有顶点都被处理。
如果排序结果列表的长度等于图中的顶点数,则拓扑排序成功;否则,图中存在环,无法进行拓扑排序。
Python实现
下面是使用Python实现拓扑排序算法的示例代码:
from collections import deque
def topological_sort(graph):
? ? # 统计每个顶点的入度
? ? in_degree = {v: 0 for v in graph}
? ? # 计算每个顶点的入度
? ? for v in graph:
? ? ? ? for neighbor in graph[v]:
? ? ? ? ? ? in_degree[neighbor] += 1
? ? # 将入度为0的顶点加入队列
? ? queue = deque([v for v in graph if in_degree[v] == 0])
? ? # 保存拓扑排序的结果
? ? result = []
? ? while queue:
? ? ? ? # 取出队列中的顶点
? ? ? ? v = queue.popleft()
? ? ? ? result.append(v)
? ? ? ? # 移除顶点及其相关边
? ? ? ? for neighbor in graph[v]:
? ? ? ? ? ? in_degree[neighbor] -= 1
? ? ? ? ? ? if in_degree[neighbor] == 0:
? ? ? ? ? ? ? ? queue.append(neighbor)
? ? # 判断是否存在环
? ? if len(result) != len(graph):
? ? ? ? raise ValueError("图中存在环,无法进行拓扑排序。")
? ? return result
# 测试
graph = {
? ? 'A': ['B', 'C'],
? ? 'B': ['D'],
? ? 'C': ['D', 'E'],
? ? 'D': ['F'],
? ? 'E': ['F'],
? ? 'F': []
}
try:
? ? result = topological_sort(graph)
? ? print("拓扑排序结果:", result)
except ValueError as e:
? ? print(e)
以上代码中,graph表示图的邻接表表示法,其中每个顶点表示为一个键,其对应的值为一个列表,列表中存储了与该顶点有直接边相连的顶点。
运行代码后,将输出拓扑排序的结果。
这就是使用Python实现拓扑排序算法的示例代码。通过这个算法,我们可以对有向无环图进行
排序,找到满足任务依赖关系的顺序。
来源:https://blog.csdn.net/chy555chy/article/details/130938158


猜你喜欢
- 今晚开放ecmall商城的QQ登陆功能,在回调时产生错误,file_get_contents函数执行时,没有抓取到正确的信息,于是改用cur
- import pandas as pdimport numpy as np一、时间类型及其在python中对应的类型时间戳–timestam
- 今日在Stack Overflow上看到一个问如何只初始化未初始化的变量,有人提供了一个函数,特地粘贴过来共大家品鉴:import tens
- Gravatar注册地址: https://en.gravatar.com/"""`Gravatar <
- mysql 创建的优化就是加索引,可是有时候会遇到加索引都没法达到想要的效果的情况,加上了所以,却还是搜索的全数据,原因是sqlEXPLAI
- 实际运用中当我用SqliteAdmin以及SQLite Expert Professional 2软件新建Sqlite数据库的时候在ASP.
- 前言:python在同一个线程中多次执行同一方法时,该方法执行耗时较长且每次执行过程及结果互不影响,如果只在主进程中执行,效率会很低,因此使
- PyQt5布局控件QFormLayout简介QFormLayout是label-field式的表单布局,顾明思议,就是实现表单方式的布局,表
- 代码如下: <% '屏蔽主流的下载工具 Dimxurl,xtool '获取浏览器AGENT xurl=lcase(Re
- 问题在Django中使用mysql偶尔会出现数据库连接丢失的情况,错误通常有如下两种OperationalError: (2006,
- 本文实例为大家分享了利用opencv实现SIFT特征提取与匹配的具体代码,供大家参考,具体内容如下1、SIFT1.1、sift的定义SIFT
- 远程运行最怕断电,训练了几个小时的数据说没就没,或者停止运行。用nohup 记录代码的输出,还可以不受断电的影响。方法1. 用nohup 运
- 效果图:1.安装django-ckeditorpip install django-ckeditor如果需要上传图片或者文件,还需要安装pi
- PL/SQL块中只能直接嵌入SELECT、DML(INSERT,UPDATE,DELETE)以及事务控制语句(COMMIT,ROLLBACK
- flash_url : "../swfupload/swfupload_f8.swf" upload_url: &quo
- 一、添加user到group第一种:user.groups.add(1) # add by id第二种:from django.contri
- 1.迭代器当您创建一个列表时,你可以逐个读取它的项。逐项读取其项称为迭代:mylist是一个可迭代的对象。当你使用列表解析式时,你创建了一个
- 本文实例讲述了php延迟静态绑定的方法。分享给大家供大家参考。具体分析如下:php延迟静态绑定:指类的self,不是以定义时为准,而是以计算
- pip是什么其实,pip就是 Python标准库(The Python Standard Library)中的一个包,这个包比较特殊,用它可
- tensorflow升级到1.0之后,增加了一些高级模块: 如tf.layers, tf.metrics, 和tf.losses,使得代码稍