problem
Description
Input
Output
Sample Input
5
2 4 2 3 1
Sample Output
3
Data Constraint
analysis
明显,题目是要我们找一个最大环,输出最大环的大小即可
那么我们枚举从s点出发,遍历一次,若回到出现过了的点:
- 若是这条路径上的点,那么更新答案return(dfs多带一个参数)
- 若不是这条路径上的点,直接return
每个点只会被遍历一次,那么时间复杂度就是
code
#include<cstdio>
#include<cstring>
using namespace std;
int next[200001],bz[200001],deep[200001];
int n,ans;
int min(int x,int y)
{
return x<y?x:y;
}
void dfs(int x,int y,int z)
{
if (bz[x])
{
if (bz[x]==y)
{
ans=min(ans,z-deep[x]);
return;
}
else return;
}
else
{
bz[x]=y;
deep[x]=z;
dfs(next[x],y,z+1);
}
}
int main()
{
freopen("message.in","r",stdin);
freopen("message.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&next[i]);
}
ans=0xfffffff;
for (int i=1;i<=n;i++)
if (!bz[i])
{
dfs(i,i,1);
}
printf("%d\n",ans);
return 0;
}