• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

RomanLin

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

【内向基环树】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;
    }
};

posted on 2024-12-18 23:31  RomanLin  阅读(62)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3