*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;
}
};