Python递归实现拓扑排序算法
拓扑排序是一种常见的图算法,用于对有向无环图(DAG)进行排序。其基本思想是找出图中没有入度的节点,将其加入排序结果中,并将与该节点相邻的节点的入度减1。重复该过程直到所有节点都被排序完成。如果图中存在环,则无法进行拓扑排序。
Python递归实现拓扑排序的方法比较简单,其大致思路如下:
1. 构建图的邻接表,并计算每个节点的入度。
2. 遍历所有节点,将入度为0的节点加入排序结果中。
3. 对于每个已加入排序结果中的节点,遍历其邻接节点,将其入度减1。
4. 递归调用拓扑排序函数,直到所有节点都被加入排序结果中。
下面是具体的代码演示:
#构建邻接表,计算入度 def build_adj_list(n, edges): adj_list = [[] for i in range(n)] in_degrees = [0] * n for edge in edges: adj_list[edge[0]].append(edge[1]) in_degrees[edge[1]] += 1 return adj_list, in_degrees #递归实现拓扑排序 def topo_sort_util(node, adj_list, in_degrees, visited, result): visited[node] = True result.append(node) for adj_node in adj_list[node]: in_degrees[adj_node] -= 1 if in_degrees[adj_node] == 0 and not visited[adj_node]: topo_sort_util(adj_node, adj_list, in_degrees, visited, result) #拓扑排序主函数 def topo_sort(n, edges): adj_list, in_degrees = build_adj_list(n, edges) visited = [False] * n result = [] for i in range(n): if in_degrees[i] == 0 and not visited[i]: topo_sort_util(i, adj_list, in_degrees, visited, result) return result
这是一个比较简单的代码实现,大致思路已经介绍清楚了。在实际使用中,可能需要考虑更加复杂的情况,比如并行任务的拓扑排序等,需要根据具体场景进行相应的修改。
相关文章