先来看这么一个问题:一个班级里有n个男生和m个女生,我们有一个n × m的矩阵,grid[i][j] = 1表示第i个男生和第j个女生相互喜欢,问这个班最多能凑出几对情侣
标准的二分图最大匹配问题,只可意会不可言传,具体看代码注释
时间复杂度:
class Solution:
def maximumInvitations(self, grid: List[List[int]]) -> int:
n = len(grid) # 男生数量
m = len(grid[0]) # 女生数量
link = dict() # 记录女生之前跟哪个男生配对过
res = 0
def match(i):
for j in range(m): # 枚举所有女生
if grid[i][j] and j not in used: # 如果男生i与女生j相互喜欢且该女生没有被匹配过
used.add(j) # 记录该女生已经配对
# 如果该女生之前没有配对过,或者之前和该女生配对的男生可以换人,就匹配成功
if j not in link or match(link[j]):
link[j] = i
return True
return False
# 遍历男生
for i in range(n):
used = set() # 记录女生是否名花有主
if match(i): # 如果匹配成功答案+1
res += 1
return res
此问题也可以转化成最大流问题,然后套最大流模板解决