There are m
boys and n
girls in a class attending an upcoming party.
You are given an m x n
integer matrix grid
, where grid[i][j]
equals 0
or 1
. If grid[i][j] == 1
, then that means the ith
boy can invite the jth
girl to the party. A boy can invite at most one girl, and a girl can accept at most one invitation from a boy.
Return the maximum possible number of accepted invitations.
Example 1:
Input: grid = [[1,1,1], [1,0,1], [0,0,1]] Output: 3 Explanation: The invitations are sent as follows: - The 1st boy invites the 2nd girl. - The 2nd boy invites the 1st girl. - The 3rd boy invites the 3rd girl.
Example 2:
Input: grid = [[1,0,1,0], [1,0,0,0], [0,0,1,0], [1,1,1,0]] Output: 3 Explanation: The invitations are sent as follows: -The 1st boy invites the 3rd girl. -The 2nd boy invites the 1st girl. -The 3rd boy invites no one. -The 4th boy invites the 2nd girl.
Constraints:
grid.length == m
grid[i].length == n
1 <= m, n <= 200
grid[i][j]
is either0
or1
.
Companies:
Bloomberg
Related Topics:
Array, Backtracking, Matrix
// OJ: https://leetcode.com/problems/maximum-number-of-accepted-invitations/
// Author: github.com/lzl124631x
// Time: O(?)
// Space: O(N)
class Solution {
public:
int maximumInvitations(vector<vector<int>>& A) {
int M = A.size(), N = A[0].size(), ans = 0;
vector<int> match(N, -1);
vector<bool> seen;
function<bool(int)> dfs = [&](int u) {
for (int v = 0; v < N; ++v) {
if (!A[u][v] || seen[v]) continue; // If there is no edge between (u, v), or this girl is visited already, skip
seen[v] = true;
if (match[v] == -1 || dfs(match[v])) {
match[v] = u;
return true;
}
}
return false;
};
for (int i = 0; i < M; ++i) { // Try each node as the starting point of DFS
seen.assign(N, false);
if (dfs(i)) ++ans;
}
return ans;
}
};