Skip to content

Commit 6ca1c7a

Browse files
committed
Time: 1162 ms (7.38%) | Memory: 166 MB (36.89%) - LeetSync
1 parent fce6b3a commit 6ca1c7a

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
class Solution {
2+
public:
3+
int maximumInvitations(vector<int>& A) {
4+
int N = A.size();
5+
vector<int> m(N, -1);
6+
vector<vector<int>> r(N);
7+
for (int i = 0; i < N; ++i) r[A[i]].push_back(i);
8+
9+
function<int(int)> dfs = [&](int u) {
10+
if (m[u] != -1) return m[u];
11+
int ans = 0;
12+
for (int v : r[u]) ans = max(ans, dfs(v));
13+
return m[u] = 1 + ans;
14+
};
15+
int ans = 0, free = 0;
16+
for (int i = 0; i < N; ++i) {
17+
if (m[i] != -1) continue;
18+
if (A[A[i]] == i) {
19+
m[i] = m[A[i]] = 0;
20+
int a = 0, b = 0;
21+
for (int v : r[i]) {
22+
if (v == A[i]) continue;
23+
a = max(a, dfs(v));
24+
}
25+
for (int v : r[A[i]]) {
26+
if (v == i) continue;
27+
b = max(b, dfs(v));
28+
}
29+
free += a + b + 2;
30+
}
31+
}
32+
33+
function<tuple<int, int, bool>(int)> dfs2 = [&](int u)->tuple<int, int, bool> {
34+
if (m[u] != -1) return {u, m[u], false};
35+
m[u] = 0;
36+
auto [entryPoint, depth, cycleVisited] = dfs2(A[u]);
37+
if (cycleVisited) {
38+
return {entryPoint, depth, true};
39+
}
40+
m[u] = 1 + depth;
41+
return {entryPoint, m[u], u == entryPoint};
42+
};
43+
for (int i = 0; i < N; ++i) {
44+
if(m[i] != -1) continue;
45+
auto [entryPoint, depth, cycleVisited] = dfs2(i);
46+
if (cycleVisited) ans = max(ans, depth);
47+
}
48+
return max(ans, free);
49+
}
50+
};

0 commit comments

Comments
 (0)