这是一个基于 Networkx 的简短 python 实现,用于查找图是否是周期性的:
import networkx as nx
from math import gcd
from functools import reduce
G = nx.DiGraph()
G.add_edges_from([('A', 'C'), ('C', 'D'), ('D', 'B'), ('B', 'A'), ('C', 'A')])
cycles = list(nx.algorithms.cycles.simple_cycles(G))
cycles_sizes = [len(c) for c in cycles]
cycles_gcd = reduce(gcd, cycles_sizes)
is_periodic = cycles_gcd > 1
print("is_periodic: {}".format(is_periodic))
代码执行以下操作:
- 根据您的示例构建图表(通过指定边)。
- 列出所有周期(AC 和 ACDB)。
- 列出所有周期大小 [2, 4]。
- 求最大公分母 (GCD)。
- 如果 GCD 为 1,则表示该图是非周期性的,否则根据定义它是周期性的。
您在上面给出的图表不是非周期性的,因为它的周期为 2。(即每个节点都可以以 2 步的倍数返回自身)
您可以使用不同的示例来获得更好的直觉,还可以通过添加以下内容来可视化您的图表:
import matplotlib.pyplot as plt
nx.draw_networkx(G, with_labels=True)
plt.show()