NetworkX是一个流行的 Python 包,用于处理许多科学 Python 发行版中包含的图形。它包括一些用于计算图循环的算法。特别simple_cycles(DiGraph)会回答你的问题。
这种方法的一个警告是您必须将图转换为有向图。这意味着无向图的每条边都将成为有向图的一个循环。(一条无向边变成两条有向边。)您可以简单地过滤输出,使其仅包含长度为 3 或更大的循环。
\n\n这是使用您链接到的图表的示例:
\n\nfrom networkx import Graph, DiGraph, simple_cycles\n\n# construct a graph using a dict: {node:[connected_nodes]}\nG = Graph(\n {\'A\':[\'B\',\'G\',\'H\'],\n \'B\':[\'A\',\'C\',\'D\'],\n \'C\':[\'B\',\'D\',\'E\'],\n \'D\':[\'B\',\'C\',\'E\',\'F\',\'G\', \'H\'],\n \'E\':[\'C\',\'D\',\'F\'],\n \'F\':[\'D\',\'E\',\'G\'],\n \'G\':[\'A\',\'D\',\'F\',\'H\'],\n \'H\':[\'A\',\'D\',\'G\'],\n }\n)\n\n# optional: draw the graph for verification\n#labels = dict(zip(G.nodes(),G.nodes()))\n#networkx.draw_networkx(G,labels=labels)\n\n# simple_cycles only accepts DiGraphs. convert G to a bi-directional\n# digraph. note that every edge of G will be included in this list!\nDG = DiGraph(G)\nlist(simple_cycles(DG))\nRun Code Online (Sandbox Code Playgroud)\n\n(截断的)输出是:
\n\n[[\'B\', \'D\', \'H\', \'G\', \'F\', \'E\', \'C\'],\n [\'B\', \'D\', \'H\', \'G\', \'A\'],\n [\'B\', \'D\', \'H\', \'A\', \'G\', \'F\', \'E\', \'C\'],\n [\'B\', \'D\', \'H\', \'A\'],\n [\'B\', \'D\', \'F\', \'G\', \'H\', \'A\'],\n [\'B\', \'D\', \'F\', \'G\', \'A\'],\n [\'B\', \'D\', \'F\', \'E\', \'C\'],\n [\'B\', \'D\', \'G\', \'F\', \'E\', \'C\'],\n ...\n]\nRun Code Online (Sandbox Code Playgroud)\n\n如果您希望自己实现这一点而不使用 NetworkX,simple_cycles()请使用 Johnson 算法。(参见 Donald B. Johnson,查找有向图的所有基本电路,SIAM J. Comput., 4(1), 77\xe2\x80\x9384)