例题:洛谷信息传递
求最小环是2015年NOIP的一道题,作为蒟蒻的我并不会这道题,看了题解之后做个笔记吧!
要求最小环我们得找出所有的环,找环的办法就是读入i的父亲之后,判断他俩是否现在已经连上了,如果已经连上了,那么就构成了一个环,此时就不需要再将他们两个连上了,不然就会死循环,这时估计就有人会问,不连上他们,那么如果有包含这一条边的环比你现在的环还小你不就错了么?(这就是这题的图的特殊了,因为对于每一个点只会有一个父亲,按照我们的遍历方式来看,所以此时i和i的父亲的父亲都已经知道了,那么就不可能再会有别的环经过这条边了),当然,如果此时父亲不同就把i并入

1 #include<iostream>
2 #include<vector>
3 #include<algorithm>
4 #include<cstring>
5 #include<climits>
6 using namespace std;
7 int fa[200010];
8 int res=INT_MAX;
9 int cnt=0;
10 int find(int x)
11 {
12 cnt++;
13 if(fa[x]==x)
14 return fa[x];
15 else
16 return find(fa[x]);
17 }
18 int main()
19 {
20 int n;
21 cin>>n;
22 for(int i=1;i<=n;i++)
23 fa[i]=i;
24 for(int i=1;i<=n;i++)
25 {
26 cnt=0;
27 int t;
28 cin>>t;
29 if(find(t)==i)
30 {
31 res=min(res,cnt);
32 }
33 else
34 {
35 fa[i]=t;
36 }
37 }
38 cout<<res;
39 return 0;
40 }