周期和非周期有向图

时间:2019-01-03 21:38:40

标签: graph graph-theory directed-graph pagerank

我对如何将有向图区分为非周期性或周期性感到困惑。 Wikipedia关于非周期图是这样说的:

'在图论的数学领域,如果没有整数k> 1来划分图的每个循环的长度,则有向图被称为非周期图。'

例如下面的图表是非周期性的或周期性的。我认为该图不是周期性的,但根据维基百科的定义,它是周期性的,因为整数k = 2划分了图中的所有周期(AC和ACDB)

enter image description here

如果有人可以提供一种方法来区分图是非周期性的还是周期性的,那将是很好的。也许提供一些周期图和非周期图的示例以帮助解释。

谢谢。

1 个答案:

答案 0 :(得分:0)

这是一个基于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,则表示该图是周期性的,否则按定义是非周期性的。

您可以使用不同的示例来获得更好的直觉,并通过添加以下内容来可视化图形:

import matplotlib.pyplot as plt
nx.draw_networkx(G, with_labels=True)
plt.show()