【内向基环树】LeetCode 2360. 图中的最长环
题解
内向基环树的一个基本特征就是总共有 \(n\) 个节点和 \(n\) 条边,且每个节点的出度至多为 \(1\),因此本题符合内向基环树的特征。
先使用拓扑排序,标记全部的简单环外的节点,剩余的节点就必定是环上的节点。
参考代码
class Solution {
public:
int longestCycle(vector<int>& edges) {
int ans = -1, n = edges.size();
vector<int> in(n);
vector<int> v;
for (int i = 0; i < n; ++ i) {
if (edges[i] != -1) {
in[edges[i]] ++;
}
}
for (int i = 0; i < n; ++ i) {
if (!in[i]) {
v.emplace_back(i);
}
}
for (int front = 0, rear = v.size(); front < rear; rear = v.size()) {
while (front < rear) {
if (edges[v[front]] != -1 && -- in[edges[v[front]]] == 0) {
v.emplace_back(edges[v[front]]);
}
++ front;
}
}
auto dfs = [&](this auto&& dfs, int x) -> int {
int res = 1;
-- in[x];
if (edges[x] == -1) {
return -1;
} else if (in[edges[x]] > 0) {
int son = dfs(edges[x]);
if (son == -1) {
res = son;
} else {
res += son;
}
}
return res;
};
for (int i = 0; i < n; ++ i) {
if (in[i]) {
ans = max(ans, dfs(i));
}
}
return ans;
}
};
浙公网安备 33010602011771号