例题:洛谷信息传递
求最小环是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 }