মান লেন m ছেলে এবং n মেয়ে আছে, এবং m = n। একটি পার্টি আসছে, এবং প্রতিটি ছেলে একটি মেয়ের সাথে যাবে। তাই ছেলেরা সব মেয়েদের আমন্ত্রণ পাঠিয়েছে এবং একটি মেয়ে শুধু একটি আমন্ত্রণ গ্রহণ করতে পারে। আমাদের ছেলেদের পাঠানো মোট আমন্ত্রণ পত্রের সংখ্যা বের করতে হবে যা মেয়েরা গ্রহণ করতে পারে। ইনপুট একটি m x n ম্যাট্রিক্স আকারে দেওয়া থাকে, যেখানে প্রতিটি সেল পজিশন i, j নির্দেশ করে যে ছেলে i মেয়ে j-কে চিঠি পাঠিয়েছে কিনা। যদি সেলটি 1 হয় তবে আমন্ত্রণ পাঠানো হয়েছে, 0 হলে নয়।
উদাহরণস্বরূপ, ইনপুট:
| 1 | 0 | 0 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
হলে আউটপুট হবে 3।
আউটপুট 3 হবে যদি:
মেয়ে ১ ছেলে ১-এর আমন্ত্রণ গ্রহণ করে।
মেয়ে ২ ছেলে ৩-এর আমন্ত্রণ গ্রহণ করে।
মেয়ে ৩ ছেলে ২-এর আমন্ত্রণ গ্রহণ করে।
(এখানে ইন্ডেক্স ১ থেকে শুরু)
সমাধানের ধাপসমূহ (বিপার্টাইট ম্যাচিং / DFS)
dfs()ফাংশন ডিফাইন করুন। এটিnode, seenইনপুট নেবে:nei= 0 থেকেNপর্যন্ত লুপ চালান:যদি
grid[node][nei]নন-জিরো এবংseen[nei] == Falseহয়, তবে:seen[nei] := Trueযদি
matching[nei] == -1অথবাdfs(matching[nei], seen) == Trueহয়, তবে:matching[nei] := nodeTrueরিটার্ন করুন
Falseরিটার্ন করুন
M := grid-এর রো সংখ্যাN := grid-এর কলাম সংখ্যাmatching := -1মান ধারণকারী আকারNএর একটি লিস্টres := 0i= 0 থেকেMপর্যন্ত লুপ চালান:seen := Falseমান ধারণকারী আকারNএর একটি লিস্টযদি
dfs(i, seen) == Trueহয়, তবে:res := 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