并查集求解有向图最小环
首先有个特殊要求的就是对于图的边是没有长度的。
然后我们采取一个简化操作,在找到这个环之间,由于只需要求环的长度,所以对于环的最后一条边,不加入之前先判断指向的点能不能最后指向原点。
#include<bits/stdc++.h>
using namespace std;
int n;
int ans=200050;
int G[200010];
int ins[200010];
int find(int x,int &cnt)
{
cnt++;
if(ins[x]==x)return x;
else find(ins[x],cnt);
}//并查集搜索,告诉a->b,反过来求b到a并查集树上距离。
int main()
{
cin>>n;
for(int i=1;i<=n;i++)scanf("%d",&G[i]),ins[i]=i;//每个人一开始都表示自己。
for(int i=1;i<=n;i++)
{
int cnt=0;
if(find(G[i],cnt)==i)
ans=min(ans,cnt);
else ins[i]=G[i];
}
cout<<ans<<endl;
// system("pause");
}