สมมติว่ามี m หนุ่ม n สาว (m=n) มีงานปาร์ตี้ แต่ละหนุ่มต้องไปกับสาวคนละคน หนุ่มเชิญสาวทั้งหมด สาวรับเชิญได้คนละ 1 ราย ให้หาจำนวนคำเชิญที่ถูกตอบรับสูงสุด ให้มาในรูปเมทริกซ์ m×n ที่ grid[i][j]=1 หมายถึงหนุ่ม i เชิญสาว j
ตัวอย่าง: เมทริกซ์ 3×3 ผลลัพธ์ 3
วิธีแก้ปัญหา (Maximum Bipartite Matching - DFS)
- ฟังก์ชัน
dfs(node, seen):- วน
neiทุกคอลัมน์:- ถ้า
grid[node][nei]และยังไม่seen[nei]:seen[nei] = True- ถ้า
matching[nei] == -1หรือdfs(matching[nei], seen):matching[nei] = node, คืนTrue
- ถ้า
- คืน
False
- วน
M, N := ขนาด grid,matching := [-1]*N,res := 0- วน
iทุกแถว:seen := [False]*N, ถ้าdfs(i, seen):res += 1 - คืน
res
ตัวอย่างโค้ด
def solve(grid):
M, N = len(grid), len(grid[0])
matching = [-1] * N
def dfs(node, seen):
for nei in range(N):
if grid[node][nei] and not seen[nei]:
seen[nei] = True
if matching[nei] == -1 or dfs(matching[nei], seen):
matching[nei] = node
return True
return False
res = 0
for i in range(M):
seen = [False] * N
if dfs(i, seen):
res += 1
return res
print(solve([[1,0,0],[1,0,1],[1,1,0]]))
อินพุต
[[1,0,0],[1,0,1],[1,1,0]]
เอาต์พุต
3