用Python写一个图算法之最拓扑排序算法含注释说明

用Python写一个图算法之最拓扑排序算法含注释说明

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

注释说明:

  1. 首先定义了一个Graph类,该类包含一个字典graph,用于存储图的邻接表;以及一个num_vertices属性,表示图中节点的个数。
  2. add_edge()方法用于添加边,将一对节点(u, v)加入到图中。
  3. topological_sort()方法用于实现最拓扑排序算法。首先计算每个节点的入度,并将入度为0的节点加入队列中。接下来进入循环,每次取出队首节点,并将其加入结果列表中。然后遍历该节点的所有邻居节点,将其入度减1,如果入度变为0,则加入队列中等待处理。循环结束后,如果处理的节点数小于总节点数,说明图中存在环路,否则返回拓扑排序的结果。
  4. 在计算每个节点的入度时,使用了Python的list类型,并初始化为0。
  5. 在遍历邻居节点时,使用了Python的for循环和列表推导式,代码简洁易读。

最拓扑排序算法是图算法中的经典算法之一,可以帮助我们找到有向无环图(DAG)中节点的一种线性排序,该排序满足对于任意的一条边(u, v),节点u在排序中出现在节点v之前。这种排序方法在许多领域都有应用,例如编译器。

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/80973
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 2024 年 7 月 16 日
下一篇 2024 年 7 月 16 日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注