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

原题传送门

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

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

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

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

 

posted @ 2017-05-18 11:38  ghostfly233  阅读(164)  评论(0编辑  收藏  举报