图中Min Cuts的随机收缩算法

时间:2015-08-05 10:39:50

标签: python algorithm graph graph-algorithm

我试图编写一个Karger算法的实现来解决最小割问题。这是我的代码

def randomVertices(g): 
    v1 = g.keys() [random.randint(0,len(g)-1)]
    v2 = g[v1] [random.randint(0,len(g[v1])-1)]
    return v1, v2


def mergeVertices(g):
    v1,v2 = randomVertices(g)

    g[v1].extend(g[v2])

    for x in g[v2]:
        l = g[x]
        for i in range(0,len(l)):
            if l[i] == v2: 
                l[i] = v1        

    while v1 in g[v1]:
        g[v1].remove(v1)

    del g[v2]

def minCut(g): 
    while len(g) > 2: 
        mergeVertices(g)
    return len(g[g.keys()[0]])

没有评论,但它应该是非常明显的。 '克'是一个字典,其键是图的顶点,每个字的值都是它所连接的顶点。 randomVertices给了我想要收缩的边缘,而mergeVertices通过删除第二个顶点来更新字典(以及图形),更新链接到这个顶点的键的值,并摆脱自循环。 它对我来说没问题,但如果我在任何测试图上运行它,我会在l = g[x]阶段得到一个KeyError,我无法理解为什么会这样。希望你们中的一些人能够帮助我。感谢。

编辑:我的代码实际上很好,错误是我用相邻列表加载文件的方式。 Cobarzan,谢谢你指出我实际上并没有统一选择边缘。

0 个答案:

没有答案