如何通过给定的边缘集检查是否存在周期

时间:2016-10-28 02:40:34

标签: python algorithm graph

我在数据帧中有一个矩阵(5х5),每次迭代我都会向数组添加新的边,例如:

[[1,2][2,3][3,4]]

然后我再添加一个,[4,1]例如:

[[1,2][2,3][3,4],[4,1]]

但我不希望这里的边长度小于5,我怎样才能检查是否有使用python的循环?

(我只想禁止ex [4,1]以避免周期小于5)

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您所描述的已知问题称为网络连接问题。

我假设你对图论有一两件事。

我们可以轻松地遵循下一个名为快速查找的算法(适用于小边缘集)

我们的想法是将图形拆分为子集..然后我们迭代每个边条目。如果它们已经在一个子集中,那么它是循环的,如果不是它们的联合

如何表示集合 简单地说,我们将使用字典,其中键是顶点,值是子集的索引。

最初,每个顶点都在其自己的子集中,直到它与另一个顶点连接。

当我们加入两个子集时,我们只需将子集顶点的字典值更改为相同

Vertices = {}

def updateConnection(old,new):
    for k,v in Vertices.items():
        if v == old:
            Vertices[k] = new

def unite(v1,v2):
    newpid = Vertices[v1]
    oldpid = Vertices[v2]
    updateConnection(oldpid,newpid)
def isConnected(v1,v2):
    return Vertices[v1] == Vertices[v2]

def isCyclic(Edges):
    for edge in Edges:
        if not edge[0] in Vertices.keys():
            Vertices[edge[0]] = edge[0]
        if not edge[1] in Vertices.keys():
            Vertices[edge[1]] = edge[1]

        if isConnected(edge[0],edge[1]):
            return True
        unite(edge[0],edge[1])
    return False