P2661-信息传递

 1 #include <bits/stdc++.h>
 2 #define _for(i,a,b) for(int i = (a);i < b;i ++)
 3 #define _rep(i,a,b) for(int i = (a);i > b;i --)
 4 #define INF 0x3f3f3f3f
 5 #define pb push_back
 6 typedef long long ll;
 7 using namespace std;
 8 inline ll read()
 9 {
10     ll ans = 0;
11     char ch = getchar(), last = ' ';
12     while(!isdigit(ch)) last = ch, ch = getchar();
13     while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
14     if(last == '-') ans = -ans;
15     return ans;
16 }
17 inline void write(ll x)
18 {
19     if(x < 0) x = -x, putchar('-');
20     if(x >= 10) write(x / 10);
21     putchar(x % 10 + '0');
22 }
23 
24 int e[200003];
25 int state[200003];
26 int m[200003];
27 int vis[200003];
28 int st;
29 int N;
30 int rnt = 0x3f3f3f3f;
31 void dfs(int nw)
32 {
33     if(vis[nw])
34         return ;
35     vis[nw] = 1;
36     if(state[e[nw]]==-1)
37     {
38         rnt = min(rnt,m[nw]-m[e[nw]]+1);
39         return ;
40     }
41     state[nw] = -1;
42     m[e[nw]] = m[nw]+1;
43     dfs(e[nw]);
44     state[nw] = 0;
45 }
46 int main()
47 {
48 //    freopen("testdata.txt","w+",stdin);
49     N = read();
50     _for(i,1,N+1)
51         e[i] = read();
52     _for(i,1,N+1)
53     {
54         if(!vis[i])
55             dfs(i);
56     }
57     write(rnt);
58     return 0;
59 }

 

posted @ 2019-09-11 08:33  Asurudo  阅读(196)  评论(0编辑  收藏  举报