信息传递(NOIP2015)(寻找最小环。。)

时间:2022-10-30 17:28:22

原题传送门

这是一道寻找最小环的题目。

在做的时候给每一个点染色。。

防止再做已经搜过的点(优化)

v[]表示是否访问的过,以及第一次访问该点的时间。

u[]表示染色。。

这道题还可以用拓补排序做。

当然,我不会写,。原理掌握的也不是很清楚。。所以,坐等以后填坑。。

下面贴代码

#include<iostream> 
#include
<cstdio>
#include
<cstring>
#define inf 0x3f3f3f3f
using namespace std;
int n,ans=inf,now;
int a[200001];
int v[200001];
int u[200001];
void dfs(int x,int q){
if(v[x]!=0)
{
if(u[x]==now)
ans
=min(ans,q-v[x]);
return ;
}
v[x]
=q;
u[x]
=now;
dfs(a[x],q
+1);
}
int main(){
scanf(
"%d",&n);
for(int i=1;i<=n;i++)
scanf(
"%d",&a[i]);
for(int i=1;i<=n;i++)
{
now
=i;
if(!v[i])
{
v[i]
=1;
u[i]
=now;
dfs(a[i],
2);
}
}
printf(
"%d\n",ans);
return 0;
}