P2661信息传递(并查集求最小环)

例题:洛谷信息传递

求最小环是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 }
复制代码
posted on   greenofyu  阅读(493)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示