Skip to content

Commit be28f7b

Browse files
authored
Create minimum-edge-reversals-so-every-node-is-reachable.cpp
1 parent 18b8f29 commit be28f7b

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
// Time: O(n)
2+
// Space: O(n)
3+
4+
// iterative dfs, tree dp
5+
class Solution {
6+
public:
7+
vector<int> minEdgeReversals(int n, vector<vector<int>>& edges) {
8+
unordered_map<int, unordered_map<int, int>> adj;
9+
for (const auto& e : edges) {
10+
adj[e[0]][e[1]] = 0;
11+
adj[e[1]][e[0]] = 1;
12+
}
13+
const auto& iter_dfs1 = [&]() {
14+
int result = 0;
15+
vector<pair<int, int>> stk = {{0, -1}};
16+
while (!empty(stk)) {
17+
const auto [u, p] = stk.back(); stk.pop_back();
18+
for (const auto& [v, _] : adj[u]) {
19+
if (v == p) {
20+
continue;
21+
}
22+
result += adj[u][v];
23+
stk.emplace_back(v, u);
24+
}
25+
}
26+
return result;
27+
};
28+
29+
const auto& iter_dfs2 = [&](int curr) {
30+
vector<int> result(n, -1);
31+
vector<pair<int, int>> stk = {{0, curr}};
32+
while (!empty(stk)) {
33+
const auto [u, curr] = stk.back(); stk.pop_back();
34+
result[u] = curr;
35+
for (const auto& [v, _] : adj[u]) {
36+
if (result[v] == -1) {
37+
stk.emplace_back(v, curr - adj[u][v] + adj[v][u]);
38+
}
39+
}
40+
}
41+
return result;
42+
};
43+
44+
return iter_dfs2(iter_dfs1());
45+
}
46+
};
47+
48+
// Time: O(n)
49+
// Space: O(n)
50+
// dfs, tree dp
51+
class Solution2 {
52+
public:
53+
vector<int> minEdgeReversals(int n, vector<vector<int>>& edges) {
54+
unordered_map<int, unordered_map<int, int>> adj;
55+
for (const auto& e : edges) {
56+
adj[e[0]][e[1]] = 0;
57+
adj[e[1]][e[0]] = 1;
58+
}
59+
const function<int (int, int)> dfs1 = [&](int u, int p) {
60+
int result = 0;
61+
for (const auto& [v, _] : adj[u]) {
62+
if (v != p) {
63+
result += adj[u][v] + dfs1(v, u);
64+
}
65+
}
66+
return result;
67+
};
68+
69+
vector<int> result(n, -1);
70+
const function<void (int, int)> dfs2 = [&](int u, int curr) {
71+
result[u] = curr;
72+
for (const auto& [v, _] : adj[u]) {
73+
if (result[v] == -1) {
74+
dfs2(v, curr - adj[u][v] + adj[v][u]);
75+
}
76+
}
77+
};
78+
79+
dfs2(0, dfs1(0, -1));
80+
return result;
81+
}
82+
};

0 commit comments

Comments
 (0)