• python实现的TopologySort


    1. from collections import defaultdict, deque
    2. class Graph:
    3. def __init__(self):
    4. self.graph = defaultdict(list)
    5. self.in_degree_dict = defaultdict(int)
    6. self.result = []
    7. def add_edge(self, u, v):
    8. self.graph[u].append(v) # 构造拓扑图
    9. if(self.in_degree_dict.get(u) == None): # 统计每个节点的入度
    10. self.in_degree_dict[u] = 0
    11. if(self.in_degree_dict.get(v) == None):
    12. self.in_degree_dict[v] = 1
    13. else:
    14. val = self.in_degree_dict.get(v) + 1
    15. self.in_degree_dict[v] = val
    16. def topological_sort(self):
    17. # print('-----graphMsg------>', type(self.graph))
    18. # print('-----graphMsg------>', self.in_degree_dict)
    19. queue = deque() # 初始化一个队列用于存放入度为0的节点
    20. for key in self.in_degree_dict:
    21. if self.in_degree_dict[key] == 0:
    22. queue.append(key)
    23. while queue:
    24. node = queue.popleft()
    25. self.result.append(node)
    26. # 访问每一个入度=0节点的相邻node,每次被访问到的节点,就对其入度-1;
    27. # 入度为0的节点加入queue当中,等待继续访问它们的相邻node
    28. for neighbor in self.graph[node]:
    29. val = self.in_degree_dict.get(neighbor) - 1
    30. self.in_degree_dict[neighbor] = val
    31. if self.in_degree_dict[neighbor] == 0:
    32. queue.append(neighbor)
    33. if len(self.result) == len(self.in_degree_dict): # 如果结果中的节点数量等于图中的节点数量,则表示拓扑排序成功
    34. return "拓扑排序结果:", self.result
    35. else:
    36. return "图中存在环,无法进行拓扑排序。", []
    37. def get_work_pair(self): # 根据拓扑排序的结果生成工作序列
    38. pair_list = []
    39. if len(self.result) == len(self.in_degree_dict) and len(self.result) != 0:
    40. for node in self.result:
    41. sub_list = self.graph.get(node)
    42. for next in sub_list:
    43. # print(node, next)
    44. pair_list.append((node, next))
    45. return pair_list
    46. def main():
    47. g = Graph()
    48. g.add_edge(1, 4)
    49. g.add_edge(1, 2)
    50. g.add_edge(2, 4)
    51. g.add_edge(4, 3)
    52. g.add_edge(4, 5)
    53. g.add_edge(3, 5)
    54. g.add_edge(2, 5)
    55. g.add_edge(5, 6)
    56. g.add_edge(3, 6)
    57. g.add_edge(6, 7)
    58. # g.add_edge(7, 1)
    59. topo_list = g.topological_sort()
    60. print(topo_list)
    61. pair_list = g.get_work_pair()
    62. print(pair_list)
    63. if __name__ == "__main__":
    64. main()

  • 相关阅读:
    家里照片都看不清了怎么办?教你三招修复旧照片
    Python 实现http server接收mutipart/form-data文件 方法1
    自签名SSL证书的安全隐患和风险有哪些?
    canal五部曲-如何处理insert幂等性的
    SRC实战-cookie注入漏洞
    TypeScript 之 Hello World!
    前后端分离,SpringBoot如何实现验证码操作
    数据通信网络之OSPFv3基础
    在java开发工具IntelliJ IDEA中如何与远程 Git 存储库同步?
    激光SLAM后端优化总结之图优化
  • 原文地址:https://blog.csdn.net/gwd777/article/details/133641544