我试图编写一个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,谢谢你指出我实际上并没有统一选择边缘。