
from collections import defaultdictclass 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 topological_sort(self): # 计算每个节点的入度 in_degree = [0] * self.num_vertices for u in self.graph: for v in self.graph[u]: in_degree[v] += 1 # 用一个队列存储所有入度为0的节点 queue = [] for i in range(self.num_vertices): if in_degree[i] == 0: queue.append(i) # 用一个计数器记录已经处理的节点数 count = 0 # 存储拓扑排序的结果 result = [] while queue: # 取出队首节点,并将其加入结果列表 u = queue.pop(0) result.append(u) # 遍历该节点的所有邻居,将其入度减一 for v in self.graph[u]: in_degree[v] -= 1 # 如果邻居节点入度为0,加入队列中等待处理 if in_degree[v] == 0: queue.append(v) count += 1 # 如果处理的节点数小于总节点数,说明存在环路 if count != self.num_vertices: print("图中存在环路") return None else: return result
注释说明:
- 首先定义了一个Graph类,该类包含一个字典graph,用于存储图的邻接表;以及一个num_vertices属性,表示图中节点的个数。
- add_edge()方法用于添加边,将一对节点(u, v)加入到图中。
- topological_sort()方法用于实现最拓扑排序算法。首先计算每个节点的入度,并将入度为0的节点加入队列中。接下来进入循环,每次取出队首节点,并将其加入结果列表中。然后遍历该节点的所有邻居节点,将其入度减1,如果入度变为0,则加入队列中等待处理。循环结束后,如果处理的节点数小于总节点数,说明图中存在环路,否则返回拓扑排序的结果。
- 在计算每个节点的入度时,使用了Python的list类型,并初始化为0。
- 在遍历邻居节点时,使用了Python的for循环和列表推导式,代码简洁易读。
最拓扑排序算法是图算法中的经典算法之一,可以帮助我们找到有向无环图(DAG)中节点的一种线性排序,该排序满足对于任意的一条边(u, v),节点u在排序中出现在节点v之前。这种排序方法在许多领域都有应用,例如编译器。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/80973
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!