AcWing 861. 二分图的最大匹配-python
原题链接
简单
作者:
Actor丶
,
2020-02-28 11:22:50
,
所有人可见
,
阅读 1979
"""
基本思想:
匈牙利算法模板:
def find(x): # x表示左半部分第x号点
for j in graph[x]: # 遍历与左半部分x号点相连的右半部分的节点
if st[j]==False:
st[j]=True
if match[j]==0 or find(match[j]): # 如果右半部分的第j号点没有与左半部分匹配或者 与右半部分的第j号点匹配的左半部分的点可以匹配其他点
match[j] = x
return True
return False
"""
# @pysnooper.snoop()
def find(x):
for j in graph[x]: # 遍历与左半部分x号点相连的右半部分的节点
if st[j]==False:
st[j]=True
if match[j]==0 or find(match[j]): # 如果右半部分的第j号点没有与左半部分匹配或者 与右半部分的第j号点匹配的左半部分的点可以匹配其他点
match[j] = x
return True
return False
if __name__=="__main__":
n1, n2, m = map(int, input().split())
graph={}
while m:
u, v = map(int, input().split())
if u not in graph:
graph[u] = [v]
else:
graph[u].append(v)
m-=1
match = [0 for i in range(n2+1)] # !!!match[j]=3存的是右半部分第j个节点匹配的第一部分的第3号节点
res = 0
for i in range(1,n1+1): # 遍历左半部分的节点,看其与右半部分是否匹配
st = [False for i in range(n2+1)] # 每次遍历时初始化st数组为False;!!!st[j]存的是右半部分的节点j是否被访问过
if find(i):
res += 1
print(res)
注释讲的很清晰