สมมติว่ามี m ชาย และ n หญิง และ m =n มีปาร์ตี้เข้ามาและเด็กผู้ชายแต่ละคนต้องไปกับผู้หญิงในงานปาร์ตี้นั้น ดังนั้นเด็กชายจึงเชิญเด็กหญิงทุกคนและเด็กหญิงสามารถตอบรับคำเชิญเดียวเท่านั้น เราต้องหาจำนวนคำเชิญทั้งหมดจากหนุ่มๆ ที่สาวๆ จะรับได้ ข้อมูลที่ป้อนจะได้รับในเมทริกซ์ขนาด m x n โดยที่แต่ละตำแหน่งของเซลล์ i, j แสดงว่าเด็กชาย i ได้ส่งจดหมายถึงเด็กหญิง j แล้ว หากเซลล์เป็น 1 แสดงว่าส่งคำเชิญแล้ว หากเป็น 0 แสดงว่าไม่มีการส่งคำเชิญ
ดังนั้นหากอินพุตเป็นแบบ
1 | 0 | 0 |
1 | 0 | 1 |
1 | 1 | 0 |
แล้วผลลัพธ์จะเป็น 3
ผลลัพธ์จะเป็น 3 ถ้า −
เด็กหญิง 1 ยอมรับคำเชิญของเด็กชาย 1
เด็กหญิง 2 ตอบรับคำเชิญของเด็กชาย 3
เด็กหญิง 3 ตอบรับคำเชิญของเด็กชาย 2
(ดัชนีเริ่มต้นที่ 1)
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดฟังก์ชัน dfs() นี่จะใช้โหนด เห็น
- สำหรับ nei ในช่วง 0 ถึง N ให้ทำ
- ถ้า grid[node][nei] ไม่ใช่ศูนย์และเห็น[nei] เป็นเท็จ ดังนั้น
- เห็น[nei] :=จริง
- หากmatch[nei] เหมือนกับ -1 หรือ dfs(matching[nei], seen) เป็นจริง ดังนั้น
- จับคู่[nei] :=โหนด
- คืนค่า True
- ถ้า grid[node][nei] ไม่ใช่ศูนย์และเห็น[nei] เป็นเท็จ ดังนั้น
- คืนค่าเท็จ
- สำหรับ nei ในช่วง 0 ถึง N ให้ทำ
- M:=จำนวนแถวของตาราง
- N :=จำนวนคอลัมน์ของกริด
- matching :=รายการขนาด N ที่มีค่า -1
- res :=0
- สำหรับฉันในช่วง 0 ถึง M ให้ทำ
- เห็น :=รายการขนาด N ที่มีค่าเป็นเท็จ
- ถ้า dfs(i, seen) เป็น True แล้ว
- ผลตอบแทน
- ผลตอบแทน
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
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