Maximum Number of Achievable Transfer Requests

hard bitmask backtracking graph

Problem

There are n buildings and a list of transfer requests requests[i] = [from, to]. Pick a subset of requests so the net change in employees at every building is zero, maximizing the subset size.

Inputn = 5, requests = [[0,1],[1,0],[0,1],[1,2],[2,0],[3,4]]
Output5
Drop requests[3] or requests[5] (last one) — the remaining five form balanced cycles.

def maximum_requests(n, requests):
    best = 0
    m = len(requests)
    for mask in range(1 << m):
        deg = [0] * n
        cnt = 0
        for i in range(m):
            if mask & (1 << i):
                u, v = requests[i]
                deg[u] -= 1
                deg[v] += 1
                cnt += 1
        if all(d == 0 for d in deg):
            best = max(best, cnt)
    return best
function maximumRequests(n, requests) {
  let best = 0;
  const m = requests.length;
  for (let mask = 0; mask < (1 << m); mask++) {
    const deg = new Array(n).fill(0);
    let cnt = 0;
    for (let i = 0; i < m; i++) {
      if (mask & (1 << i)) {
        deg[requests[i][0]]--; deg[requests[i][1]]++; cnt++;
      }
    }
    if (deg.every(d => d === 0)) best = Math.max(best, cnt);
  }
  return best;
}
class Solution {
    public int maximumRequests(int n, int[][] requests) {
        int best = 0, m = requests.length;
        for (int mask = 0; mask < (1 << m); mask++) {
            int[] deg = new int[n];
            int cnt = 0;
            for (int i = 0; i < m; i++) {
                if ((mask & (1 << i)) != 0) {
                    deg[requests[i][0]]--; deg[requests[i][1]]++; cnt++;
                }
            }
            boolean ok = true;
            for (int d : deg) if (d != 0) { ok = false; break; }
            if (ok) best = Math.max(best, cnt);
        }
        return best;
    }
}
int maximumRequests(int n, vector<vector<int>>& requests) {
    int best = 0, m = (int)requests.size();
    for (int mask = 0; mask < (1 << m); mask++) {
        vector<int> deg(n, 0);
        int cnt = 0;
        for (int i = 0; i < m; i++) {
            if (mask & (1 << i)) {
                deg[requests[i][0]]--; deg[requests[i][1]]++; cnt++;
            }
        }
        bool ok = true;
        for (int d : deg) if (d) { ok = false; break; }
        if (ok) best = max(best, cnt);
    }
    return best;
}
Time: O(2^m · (m + n)) Space: O(n)