/*
QUESTION 11: Amazon HackOn OA — Maximizing Reachability by Reversing Edges
Problem Statement:
You are given a directed graph.
You may reverse the direction of at most two existing directed edges.
After doing this, define the score as:
the number of ordered pairs (u, v) such that v is reachable from u.
Return the maximum score possible.
Hard Constraints:
1 <= N <= 120
1 <= M <= 300
Example:
N = 4
Edges:
1 -> 2
3 -> 2
3 -> 4
Expected Output:
10
Explanation:
Reverse edge 3 -> 2 into 2 -> 3.
Then the graph becomes:
1 -> 2 -> 3 -> 4
Reachable ordered pairs including self-pairs:
1 can reach 1,2,3,4
2 can reach 2,3,4
3 can reach 3,4
4 can reach 4
Total = 10
Brute Force:
Try:
- reversing no edge
- reversing one edge
- reversing every pair of edges
For every modified graph, run DFS/BFS from every node and count reachable pairs.
Time Complexity:
O(M^2 * N * (N + M))
Optimized Approach:
Still enumerate edge choices because at most two edges are reversed.
For each modified graph, compute reachability using bitset transitive closure.
reach[i] stores all nodes reachable from i.
If i can reach k:
reach[i] |= reach[k]
Time Complexity:
O(M^2 * N^3 / 64)
Space Complexity:
O(N^2 / 64)
*/
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
long long countReachable(int n,
vector<pair<int, int>>& edges,
int reverseA,
int reverseB) {
vector<bitset<125>> reach(n);
for (int i = 0; i < n; i++) {
reach[i][i] = 1;
}
for (int i = 0; i < (int)edges.size(); i++) {
int u = edges[i].first;
int v = edges[i].second;
if (i == reverseA || i == reverseB) {
swap(u, v);
}
reach[u][v] = 1;
}
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
if (reach[i][k]) {
reach[i] |= reach[k];
}
}
}
long long total = 0;
for (int i = 0; i < n; i++) {
total += reach[i].count();
}
return total;
}
long long maximizeReachablePairs(int n, vector<pair<int, int>>& edges) {
int m = edges.size();
for (auto &e : edges) {
e.first--;
e.second--;
}
long long ans = countReachable(n, edges, -1, -1);
for (int i = 0; i < m; i++) {
ans = max(ans, countReachable(n, edges, i, -1));
}
for (int i = 0; i < m; i++) {
for (int j = i + 1; j < m; j++) {
ans = max(ans, countReachable(n, edges, i, j));
}
}
return ans;
}
};
int main() {
Solution sol;
int n = 4;
vector<pair<int, int>> edges = {
{1, 2},
{3, 2},
{3, 4}
};
cout << sol.maximizeReachablePairs(n, edges) << endl;
return 0;
}
LyoKUVVFU1RJT04gMTE6IEFtYXpvbiBIYWNrT24gT0Eg4oCUIE1heGltaXppbmcgUmVhY2hhYmlsaXR5IGJ5IFJldmVyc2luZyBFZGdlcwoKUHJvYmxlbSBTdGF0ZW1lbnQ6CllvdSBhcmUgZ2l2ZW4gYSBkaXJlY3RlZCBncmFwaC4KCllvdSBtYXkgcmV2ZXJzZSB0aGUgZGlyZWN0aW9uIG9mIGF0IG1vc3QgdHdvIGV4aXN0aW5nIGRpcmVjdGVkIGVkZ2VzLgoKQWZ0ZXIgZG9pbmcgdGhpcywgZGVmaW5lIHRoZSBzY29yZSBhczoKdGhlIG51bWJlciBvZiBvcmRlcmVkIHBhaXJzICh1LCB2KSBzdWNoIHRoYXQgdiBpcyByZWFjaGFibGUgZnJvbSB1LgoKUmV0dXJuIHRoZSBtYXhpbXVtIHNjb3JlIHBvc3NpYmxlLgoKSGFyZCBDb25zdHJhaW50czoKMSA8PSBOIDw9IDEyMAoxIDw9IE0gPD0gMzAwCgpFeGFtcGxlOgpOID0gNApFZGdlczoKMSAtPiAyCjMgLT4gMgozIC0+IDQKCkV4cGVjdGVkIE91dHB1dDoKMTAKCkV4cGxhbmF0aW9uOgpSZXZlcnNlIGVkZ2UgMyAtPiAyIGludG8gMiAtPiAzLgoKVGhlbiB0aGUgZ3JhcGggYmVjb21lczoKMSAtPiAyIC0+IDMgLT4gNAoKUmVhY2hhYmxlIG9yZGVyZWQgcGFpcnMgaW5jbHVkaW5nIHNlbGYtcGFpcnM6CjEgY2FuIHJlYWNoIDEsMiwzLDQKMiBjYW4gcmVhY2ggMiwzLDQKMyBjYW4gcmVhY2ggMyw0CjQgY2FuIHJlYWNoIDQKClRvdGFsID0gMTAKCkJydXRlIEZvcmNlOgpUcnk6Ci0gcmV2ZXJzaW5nIG5vIGVkZ2UKLSByZXZlcnNpbmcgb25lIGVkZ2UKLSByZXZlcnNpbmcgZXZlcnkgcGFpciBvZiBlZGdlcwoKRm9yIGV2ZXJ5IG1vZGlmaWVkIGdyYXBoLCBydW4gREZTL0JGUyBmcm9tIGV2ZXJ5IG5vZGUgYW5kIGNvdW50IHJlYWNoYWJsZSBwYWlycy4KClRpbWUgQ29tcGxleGl0eToKTyhNXjIgKiBOICogKE4gKyBNKSkKCk9wdGltaXplZCBBcHByb2FjaDoKU3RpbGwgZW51bWVyYXRlIGVkZ2UgY2hvaWNlcyBiZWNhdXNlIGF0IG1vc3QgdHdvIGVkZ2VzIGFyZSByZXZlcnNlZC4KCkZvciBlYWNoIG1vZGlmaWVkIGdyYXBoLCBjb21wdXRlIHJlYWNoYWJpbGl0eSB1c2luZyBiaXRzZXQgdHJhbnNpdGl2ZSBjbG9zdXJlLgoKcmVhY2hbaV0gc3RvcmVzIGFsbCBub2RlcyByZWFjaGFibGUgZnJvbSBpLgpJZiBpIGNhbiByZWFjaCBrOgpyZWFjaFtpXSB8PSByZWFjaFtrXQoKVGltZSBDb21wbGV4aXR5OgpPKE1eMiAqIE5eMyAvIDY0KQoKU3BhY2UgQ29tcGxleGl0eToKTyhOXjIgLyA2NCkKKi8KCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgU29sdXRpb24gewpwdWJsaWM6CiAgICBsb25nIGxvbmcgY291bnRSZWFjaGFibGUoaW50IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHBhaXI8aW50LCBpbnQ+PiYgZWRnZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldmVyc2VBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXZlcnNlQikgewogICAgICAgIAogICAgICAgIHZlY3RvcjxiaXRzZXQ8MTI1Pj4gcmVhY2gobik7CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgIHJlYWNoW2ldW2ldID0gMTsKICAgICAgICB9CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCllZGdlcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICBpbnQgdSA9IGVkZ2VzW2ldLmZpcnN0OwogICAgICAgICAgICBpbnQgdiA9IGVkZ2VzW2ldLnNlY29uZDsKCiAgICAgICAgICAgIGlmIChpID09IHJldmVyc2VBIHx8IGkgPT0gcmV2ZXJzZUIpIHsKICAgICAgICAgICAgICAgIHN3YXAodSwgdik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJlYWNoW3VdW3ZdID0gMTsKICAgICAgICB9CgogICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbjsgaysrKSB7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAocmVhY2hbaV1ba10pIHsKICAgICAgICAgICAgICAgICAgICByZWFjaFtpXSB8PSByZWFjaFtrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbG9uZyBsb25nIHRvdGFsID0gMDsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgdG90YWwgKz0gcmVhY2hbaV0uY291bnQoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0b3RhbDsKICAgIH0KCiAgICBsb25nIGxvbmcgbWF4aW1pemVSZWFjaGFibGVQYWlycyhpbnQgbiwgdmVjdG9yPHBhaXI8aW50LCBpbnQ+PiYgZWRnZXMpIHsKICAgICAgICBpbnQgbSA9IGVkZ2VzLnNpemUoKTsKCiAgICAgICAgZm9yIChhdXRvICZlIDogZWRnZXMpIHsKICAgICAgICAgICAgZS5maXJzdC0tOwogICAgICAgICAgICBlLnNlY29uZC0tOwogICAgICAgIH0KCiAgICAgICAgbG9uZyBsb25nIGFucyA9IGNvdW50UmVhY2hhYmxlKG4sIGVkZ2VzLCAtMSwgLTEpOwoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewogICAgICAgICAgICBhbnMgPSBtYXgoYW5zLCBjb3VudFJlYWNoYWJsZShuLCBlZGdlcywgaSwgLTEpKTsKICAgICAgICB9CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IG07IGorKykgewogICAgICAgICAgICAgICAgYW5zID0gbWF4KGFucywgY291bnRSZWFjaGFibGUobiwgZWRnZXMsIGksIGopKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGFuczsKICAgIH0KfTsKCmludCBtYWluKCkgewogICAgU29sdXRpb24gc29sOwoKICAgIGludCBuID0gNDsKICAgIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gZWRnZXMgPSB7CiAgICAgICAgezEsIDJ9LAogICAgICAgIHszLCAyfSwKICAgICAgICB7MywgNH0KICAgIH07CgogICAgY291dCA8PCBzb2wubWF4aW1pemVSZWFjaGFibGVQYWlycyhuLCBlZGdlcykgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==