Topological ordering in DAG (有向无环图的拓扑排序问题)

**

Topological ordering in DAG (有向无环图的拓扑排序问题)

  1. 前言
  2. 拓扑排序有啥用
  3. 拓扑排序实现
    1. 通过不断寻找那些没有income edge的节点来实现
    2. 通过排序DFS深度优先算法每个节点的完成时间来实现

(一)前言

最近学算法学到了有向无环图的拓扑排序,即Topological ordering in directed acyclic graph,留下一点笔记加深理解。

(二)拓扑排序有啥用

首先,我们先说说啥叫拓扑排序。以下是维基百科的说法。

In computer science, a topological sort or topological ordering of a directed graph is a linear ordering of its vertices such that for every directed edge uv from vertex u to vertex v, u comes before v in the ordering.

简言之,排序过的结果里出现的每条edge的父节点都需要在子节点之前出现。

假设我们手上有一堆任务要做,但是做每个任务之前都可能有一些前置任务,我们必须要完成一个任务的前置任务才可以完成这个任务。大学里我们在选课的时候也会遇到类似的问题,如果你前面线性代数忘了选,到了后边想要选一些计算机课的时候就凉凉了。这个时候我们或许可以借助一下拓扑排序帮你做一下选课的参考,搞清楚到底需要上哪些课才能满足我们想上的课的前置要

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个基于深度优先搜索的python代码,用于求有向无环图的所有拓扑排序: ```python from collections import defaultdict class DAG: def __init__(self, vertices): self.graph = defaultdict(list) self.vertices = vertices def add_edge(self, u, v): self.graph[u].append(v) def dfs(self, visited, stack, u): visited[u] = True for v in self.graph[u]: if not visited[v]: self.dfs(visited, stack, v) stack.append(u) def topological_sort(self): visited = {v: False for v in self.vertices} stack = [] for v in self.vertices: if not visited[v]: self.dfs(visited, stack, v) return stack[::-1] def all_topological_sorts_util(self, visited, stack, all_sorts): flag = False for v in self.vertices: if not visited[v] and not self.incoming_edges(v, visited): visited[v] = True stack.append(v) self.all_topological_sorts_util(visited, stack, all_sorts) visited[v] = False stack.pop() flag = True if not flag: all_sorts.append(stack[:]) def incoming_edges(self, v, visited): count = 0 for u in self.vertices: if visited[u] and v in self.graph[u]: count += 1 return count def all_topological_sorts(self): visited = {v: False for v in self.vertices} stack = [] all_sorts = [] self.all_topological_sorts_util(visited, stack, all_sorts) return all_sorts # 示例 if __name__ == "__main__": g = DAG(['A', 'B', 'C', 'D']) g.add_edge('A', 'B') g.add_edge('A', 'C') g.add_edge('B', 'D') g.add_edge('C', 'D') print("所有拓扑排序:") print(g.all_topological_sorts()) ``` 在上面的示例中,我们创建了一个有向无环图,然后使用 `all_topological_sorts` 函数来获取所有可能的拓扑排序。请注意,如果图中存在环路,则无法进行拓扑排序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值