*lc 6135. 图中的最长环(图论+环)

https://leetcode.cn/contest/weekly-contest-304/problems/longest-cycle-in-a-graph/

给你一个 n 个节点的 有向图 ,节点编号为 0 到 n - 1 ,其中每个节点 至多 有一条出边。

图用一个大小为 n 下标从 0 开始的数组 edges 表示,节点 i 到节点 edges[i] 之间有一条有向边。如果节点 i 没有出边,那么 edges[i] == -1 。

请你返回图中的 最长 环,如果没有任何环,请返回 -1 。

一个环指的是起点和终点是 同一个 节点的路径。
  • 输入:edges = [3,3,4,2,3]
    输出去:3
    解释:图中的最长环是:2 -> 4 -> 3 -> 2 。
    这个环的长度为 3 ,所以返回 3 。

  • 输入:edges = [2,-1,3,1]
    输出:-1
    解释:图中没有任何环。

class Solution {
public:
    int longestCycle(vector<int>& edges) {
        int n=edges.size();
        vector<int> vis(n),cnt(n);
        int ans=-1;
        for(int i=0;i<n;i++)
        {
            if(vis[i]==0)
            {
                vector<int> v;
                int start=i;
                v.push_back(start);
                cnt[start]=1;
                while(1)
                {
                    int flag=start;
                    start=edges[start];
                    if(start==-1||vis[start]!=0) break;
                    v.push_back(start);
                    if(cnt[start])
                    {
                        ans=max(ans,cnt[flag]-cnt[start]+1); break;
                    }
                    else cnt[start]=cnt[flag]+1;
                }
                for(int x:v) vis[x]=1;
            }
        }
        return ans;
    }
};
posted @ 2022-07-31 16:17  Vijurria  阅读(121)  评论(0编辑  收藏  举报