拓扑排序-Python实现

拓扑排序- TopSort

拓扑序:
如果图中从V到W有一条有向路径,则V一定排在W之前

AOV(Activity On Vertex)
如果有合理的拓扑序,则一定是有向无环图(Directed Acyclic Graph, DAG)

DAG
TopSort

graph = {
    1:[3],
    2:[3,13],
    3:[7],
    4:[5],
    5:[6],
    6:[15],
    7:[10,11,12],
    8:[9],
    9:[10,12],
    10:[14],
    11:[],
    12:[],
    13:[],
    14:[],
    15:[],
}
def flatten(a):
    if not isinstance(a, (list, )):
        return [a]
    else:
        b = []
        for item in a:
            b += flatten(item)
    return b
from collections import Counter
from collections import deque
def TopSort(graph):
    # 遍历图,得到InDegree
    cnt = Counter() # 使用Python内置的计数器
    for val in flatten(list(graph.values())): 
    # 拿到所有的邻接点因为是每一个结点的邻接点是List存储,所以要展平
        cnt[val] += 1
    InDegree = {node: cnt[node] for node in graph}
    # 将所有入度为0的顶点入列
    queue = deque()
    zero_indeg = [node for node in graph if InDegree[node] == 0]
    queue.extend(zero_indeg)
    # 拓扑排序
    TopOrder = list()
    while len(queue):
        node = queue.popleft()
        TopOrder.append(node)
        for adj in graph[node]: # 从图中拿走这一点,就是把它的邻接点的入度-1
            InDegree[adj] -= 1
            if InDegree[adj] == 0: # 上一步操作之后,还要对图中的结点进行入度判断
                queue.append(adj)
    if len(TopOrder) != len(graph): # 最后结果不包含全部的点,则图不连通
        return False
    else:
        return True
[1, 2, 4, 8, 3, 13, 5, 9, 7, 6, 10, 11, 12, 15, 14]
True
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
拓扑排序是一种对有向无环图(DAG)进行排序的算法。在Python中,可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来实现拓扑排序。 以下是使用深度优先搜索(DFS)算法实现拓扑排序的示例代码: ```python from collections import defaultdict # 定义有向图的类 class Graph: def __init__(self, num_vertices): self.graph = defaultdict(list) # 使用字典存储图的邻接表 self.num_vertices = num_vertices def add_edge(self, u, v): self.graph[u].append(v) # 深度优先搜索函数 def dfs(self, v, visited, stack): visited[v] = True for neighbor in self.graph[v]: if not visited[neighbor]: self.dfs(neighbor, visited, stack) stack.append(v) # 拓扑排序函数 def topological_sort(self): visited = [False] * self.num_vertices stack = [] for vertex in range(self.num_vertices): if not visited[vertex]: self.dfs(vertex, visited, stack) return stack[::-1] # 返回逆序的结果 # 测试示例 g = Graph(6) g.add_edge(5, 2) g.add_edge(5, 0) g.add_edge(4, 0) g.add_edge(4, 1) g.add_edge(2, 3) g.add_edge(3, 1) result = g.topological_sort() print("拓扑排序结果:", result) ``` 这段代码首先定义了一个有向图的类 `Graph`,其中包含了添加边、深度优先搜索和拓扑排序的方法。在测试示例中,创建了一个有向图实例 `g`,并添加了6个顶点和相应的边。然后调用 `topological_sort` 方法进行拓扑排序,并将结果打印出来。 希望这段代码能够帮助到你理解如何在Python实现拓扑排序算法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值