题目
代码
#include<iostream>
#include<cstdio>
using namespace std;
int n,k,ch,yh,mina=0x7f7f7f7;
int d[200010];
int c[200010];
void dfs(int s,int ans)
{
if(c[s]==k){
yh=s;
ch=ans;
return;
}
if(c[s]!=k&&c[s])
return;
c[s]=k;
dfs(d[s],ans+1);
if(s==yh)
mina=min(mina,ch-ans);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>d[i];
for(int i=1;i<=n;i++)
if(!c[i])
{
k++;
dfs(i,0);
yh=0;
ch=0;
}
printf("%d",mina);
return 0;
}
求图中最小的环。
如果一个人的入度为0,把这个人和他连出的边删去(即标记这个人并将他下一个人的入度减 1)
如果下一个人的入度为0则将他也删去……
最后把所有入度为0的人都删去了,剩下的都是环。