因此,我有一个通常形成某种圆形形状的点的列表,除了通常很少有来自圆的分支,它们基本上只是从圆的边界沿特定方向行进的线。我想创建一个函数,当给出此坐标/点列表时,该函数将查找在这组点中是否存在完整路径。
我考虑过要创建一个起点,并确定是否存在不重复点的路径(即(1,1)->(2,1)->(1,1)不允许),并且可以回到起点但是,如果起点在圆的分支中,则此方法将无效。
例如,坐标列表
[[0, 0], [0, 1], [1, 2], [2, 3], [3, 3], [3, 4], [4, 4], [3, 2], [3, 1], [3, 0], [2, -1], [1, -1], [0, -1]]
将形成完整的路径,而如果我取出[1, -1]
,则不会形成完整的路径。
答案 0 :(得分:1)
您要寻找的是simple cycle。图论包networkx
提供了一种在simple_cycles
中查找那些的方法。我们需要做的只是创建图表的一小部分工作:
import networkx as nx
def has_simple_cycle(l, start):
G = nx.DiGraph()
G.add_edges_from((v1, v2) for v1 in l for v2 in l if v1 != v2 and max(abs(v1[0] - v2[0]), abs(v1[1] - v2[1])) <= 1)
return any(start in c and len(c) > 2 for c in nx.simple_cycles(G))
在您给出的示例中:
In [26]: has_simple_cycle(l=[(0, 0), (0, 1), (1, 2), (2, 3), (3, 3), (3, 4), (4, 4), (3, 2), (3, 1), (3, 0), (2, -1), (1, -1), (0, -1)], start=(0, 0))
Out[26]: True
In [27]: has_simple_cycle(l=[(0, 0), (0, 1), (1, 2), (2, 3), (3, 3), (3, 4), (4, 4), (3, 2), (3, 1), (3, 0), (2, -1), (0, -1)], start=(0, 0))
Out[27]: False