python 拓扑排序_python拓扑排序算法实现

本文介绍了拓扑排序的概念及其在有向无环图中的应用,并详细解释了两种常用的拓扑排序算法——Kahn算法和深度优先搜索(DFS)。通过具体实例和Python代码展示了这两种算法的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拓扑排序是指在有向无环图中,把所有结点按照一定的排序排成一列,使得左边的点都指向右边的点。

一般有两种方法做拓扑排序

Kahn算法

用一个一维数组存每个结点的入度。用一个数据结构(随意都可以,数组,栈,列表等等)存储所有入度为0的结点。每次从入度为0的结点出发,记录路径,删除该结点,把该结点指向的点的入度减1,再找入度为0的结点,存进数据结构。再循环操作,直到找不到入度为0的结点就停止,如果还剩结点或者路径长度不够,说明该图不是有向无环图。

注意:如果是要打印字典序排序,就用优先列表存入度为0的结点

DFS深搜

从任意未被访问的结点出发做深搜。回溯的时候记录记录路径,得到的路径再倒序一下就是正确的拓扑排序。直到所有结点都被访问完,每次深搜的倒序路径拼接在一起就是答案。

样例图片

DAG拓扑排序深搜例图

python代码:

from queue import PriorityQueue as pQueue

import sys

sys.setrecursionlimit(100000)

# 这是最常见的拓扑排序,0入度集合可以用队列,栈等等,只要能存储0入度的点就行

# 这里用了队列,其实就是跟广搜bfs差不多,入度为0的才入队

def ts_bfs(inDegrees, graph):

n = len(graph)

result = ''

q = []

vis = [False] * n

for i, inDegree in enumerate(inDegrees):

if inDegree == 0:

q.append(i)

vis[i] = True

while q:

s = q.pop(0)

result += str(s)

for sub in graph[s]:

if not vis[sub]:

inDegrees[sub] -= 1

if inDegrees[sub] == 0:

q.append(sub)

return result if len(result) == n else 'The graph is not DAG'

# 满足拓扑排序下,序号从小到大排序或字典序排序

def ts_bfs_pq(inDegrees, graph):

n = len(graph)

result = ''

q = pQueue()

vis = [False] * n

for i, inDegree in enumerate(inDegrees):

if inDegree == 0:

q.put(i)

vis[i] = True

while not q.empty():

s = q.get()

result += str(s)

非原创,算法来自于互联网!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值