并查集求最小环

例题:洛谷信息传递

求最小环是2015年NOIP的一道题,作为蒟蒻的我并不会这道题,看了题解之后做个笔记吧!

要求最小环我们得找出所有的环,找环的办法就是读入i的父亲之后,判断他俩是否现在已经连上了,如果已经连上了,那么就构成了一个环,此时就不需要再将他们两个连上了,不然就会死循环,这时估计就有人会问,不连上他们,那么如果有包含这一条边的环比你现在的环还小你不就错了么?(这就是这题的图的特殊了,因为对于每一个点只会有一个父亲,按照我们的遍历方式来看,所以此时ii的父亲的父亲都已经知道了,那么就不可能再会有别的环经过这条边了),当然,如果此时父亲不同就把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 }

猜你喜欢

转载自www.cnblogs.com/greenofyu/p/12002362.html
今日推荐