gpt4 book ai didi

python - Python 中的 Hopcroft–Karp 算法

转载 作者:太空狗 更新时间:2023-10-29 21:51:04 25 4
gpt4 key购买 nike

我正在尝试实现 Hopcroft Karp algorithm在 Python 中使用 networkx 作为图形表示。

目前我是这样的:

#Algorithms for bipartite graphs

import networkx as nx
import collections

class HopcroftKarp(object):
INFINITY = -1

def __init__(self, G):
self.G = G

def match(self):
self.N1, self.N2 = self.partition()
self.pair = {}
self.dist = {}
self.q = collections.deque()

#init
for v in self.G:
self.pair[v] = None
self.dist[v] = HopcroftKarp.INFINITY

matching = 0

while self.bfs():
for v in self.N1:
if self.pair[v] and self.dfs(v):
matching = matching + 1

return matching

def dfs(self, v):
if v != None:
for u in self.G.neighbors_iter(v):
if self.dist[ self.pair[u] ] == self.dist[v] + 1 and self.dfs(self.pair[u]):
self.pair[u] = v
self.pair[v] = u

return True

self.dist[v] = HopcroftKarp.INFINITY
return False

return True

def bfs(self):
for v in self.N1:
if self.pair[v] == None:
self.dist[v] = 0
self.q.append(v)
else:
self.dist[v] = HopcroftKarp.INFINITY

self.dist[None] = HopcroftKarp.INFINITY

while len(self.q) > 0:
v = self.q.pop()
if v != None:
for u in self.G.neighbors_iter(v):
if self.dist[ self.pair[u] ] == HopcroftKarp.INFINITY:
self.dist[ self.pair[u] ] = self.dist[v] + 1
self.q.append(self.pair[u])

return self.dist[None] != HopcroftKarp.INFINITY


def partition(self):
return nx.bipartite_sets(self.G)

算法取自http://en.wikipedia.org/wiki/Hopcroft%E2%80%93Karp_algorithm但是它不起作用。我使用下面的测试代码

G = nx.Graph([
(1,"a"), (1,"c"),
(2,"a"), (2,"b"),
(3,"a"), (3,"c"),
(4,"d"), (4,"e"),(4,"f"),(4,"g"),
(5,"b"), (5,"c"),
(6,"c"), (6,"d")
])

matching = HopcroftKarp(G).match()

print matching

不幸的是,这不起作用,我最终陷入了无限循环:(。有人可以发现错误吗,我没有想法,我必须承认我还没有完全理解算法,所以它主要是一个实现维基百科上的伪代码

最佳答案

线

if self.pair[v] and self.dfs(v):

应该是

if self.pair[v] is None and self.dfs(v):

根据维基百科页面上的伪代码。我看到的唯一其他问题是您将双端队列用作堆栈,而您想将其用作队列。要解决这个问题,您只需要向左弹出而不是向右弹出(向右弹出)。所以行

v = self.q.pop()

应该是

v = self.q.popleft()

希望其他一切正常。我只是在检查您的 Python 代码是否以与维基百科上的伪代码相同的方式工作,所以希望伪代码是正确的。

关于python - Python 中的 Hopcroft–Karp 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4697228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com