题目: https://www.luogu.org/problemnew/show/P2661
题解:
原理:
1.如果有两个点祖先节点相同,那么就可以构成一个环,长度为两个点到祖先节点长度之和+1。
2.新加入的一条边的两个端点在并查集中同祖先,则一定成环 。

注意:图中不一定有一个环,即不一定是一个连通图,可能有好几个连通分量。

解法一:并查集+找爹函数传地址变量记录深度

#include<bits/stdc++.h>
using namespace std;
int n,f,i,k,cnt=0,ans=0x3f3f3f3f;//重要初始化
int fa[200005];
inline int find(int x,int &cnt)//找爹函数改进版
{//cnt要用地址来操作,因为是在递归中计数用的cnt++;//层数更新 if(fa[x]==x) return x;else return find(fa[x],cnt);
}
int main()
{cin>>n;for(i=1;i<=n;i++) fa[i]=i;//并查集的初始化for(i=1;i<=n;i++){cin>>f;//在本题中,这条路径是i->f cnt=0;//重要的初始化 if(find(f,cnt)==i)//存在环路,可能=不止有一个环路 {ans=min(cnt,ans);//维护最小的环的长度 //在使用min或max时,要注意维护变量的初始化 }elsefa[i]=f;} cout<<ans<<endl;return 0;
}


解法二:带权路径并查集

#include<bits/stdc++.h>
using namespace std;
int f[200002],d[200002],n,minn,last;
int find(int x){//带权路径并查集模板 if(f[x]==x) return x;else{int last=f[x];//记录父节点 f[x]=find(f[x]);//更新祖先(开国太祖)节点 d[x]+=d[last];//更新路径长 return f[x];//不理解可以手推一遍并查集 }
}
void check(int a,int b){int x=find(a),y=find(b);if(x==y) minn=min(minn,d[a]+d[b]+1);
//新加入的一条边的两个端点在并查集中同祖先,则一定成环
//d[]保存该点到其祖先(开国太祖)的路径长度 else{f[x]=y;//合并 d[a]=d[b]+1;//更新路径长度 }}
int main(){int i,t;cin>>n;for(i=1;i<=n;i++) f[i]=i;//并查集初始化minn=0x7777777;//重要初始化for(i=1;i<=n;i++){cin>>t;check(i,t);} cout<<minn<<endl;return 0;
}



解法三:
原理:环中元素的入度等于出度。

#include<bits/stdc++.h>
using namespace std;
#define N 200005
#define INF 200005
int to[N],indegree[N];//记录入度
bool visit[N];
int n;
void delzero(){bool flag=1;for(int i=1;i<=n;i++){//仅仅是一轮删除 if(indegree[i]==0&&!visit[i]){
//以i为起点的边未被访问过,且i点入度为0,即这是一条废边 flag=0;//标志着还有边可以删 visit[i]=1;//标记删除的点,在search()中不会被访问 indegree[to[i]]--;//删除一条边 }}if(flag) return;//没有废边可以删除了 else delzero();//进行下一轮删除
}
int ans=INF;//重要初始化
void search(int start,int now,int step){if(start==now){ans=min(ans,step);return;}//设置返回条件visit[now]=1;//标记 search(start,to[now],step+1); //利用递归遍历环
}
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>to[i];indegree[to[i]]++;//计算入度 }delzero();for(int i=1;i<=n;i++){if(!visit[i]){//剪枝 visit[i]=1;//标记,认为一个连通块中至多有一个环 search(i,to[i],1);//遍历所有环 }}cout<<ans<<endl;return 0;
}


最小环的几种解法(并查集、删边)相关推荐

  1. *【HDU - 2473】Junk-Mail Filter (并查集--删点操作)

    题干: Recognizing junk mails is a tough task. The method used here consists of two steps:  1) Extract ...

  2. 【 newcoder 】幼儿园战争 【并查集+删并查】

    时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 幼儿园的孩子们正在做游戏,每个人都有自己的帮派 ...

  3. hdu 4496 并查集 逆向 并查集删边

    貌似某大犇说过 正难则反,,, 题目说要对这张图进行删边,然后判断联通块的个数,那么就可以先把所有边都删掉,之后从后往前加边,若加的边两端点不在同一个联通块中, 那么此时联通快个数少一,否则不变 1 ...

  4. 并查集(Union-Find)算法介绍

    本文主要介绍解决动态连通性一类问题的一种算法,使用到了一种叫做并查集的数据结构,称为Union-Find. 更多的信息可以参考Algorithms 一书的Section 1.5,实际上本文也就是基于它 ...

  5. 算法笔记(三)特殊数据结构——哈希表、有序表、并查集、KMP、Manacher、单调栈、位图、大数据类题

    layout: post title: 算法笔记(三)特殊数据结构--哈希表.有序表.并查集.KMP.Manacher.单调栈.位图.大数据类题 description: 算法笔记(三)特殊数据结构- ...

  6. CodeForces - 722C Destroying Array (并查集/集合的插入和删除)

    原题链接:https://vjudge.net/problem/511814/origin Description: You are given an array consisting of n no ...

  7. Kruskal算法:贪心+并查集=最小生成树

    http://www.51nod.com/ Kruskal算法的高效实现需要一种称作并查集的结构.我们在这里不介绍并查集,只介绍Kruskal算法的基本思想和证明,实现留在以后讨论. Kruskal算 ...

  8. Leetcode——唯唯诺诺对并查集的初次相见

    基本概念 并查集是一种数据结构 并查集这三个字,一个字代表一个意思. 并(Union),代表合并 查(Find),代表查找 集(Set),代表这是一个以字典为基础的数据结构,它的基本功能是合并集合中的 ...

  9. 牛客小白月赛25 C白魔法师 (bfs | 并查集)

    题目描述:题目链接 题意分析: n个节点 n-1条边,非常明显的树形结构(题目中就有说 ),因此不需要考虑环的情况. 树上有两种颜色,一种是白色一种是黑色,我们可以推断出这题应该是考虑连通块的大小,那 ...

最新文章

  1. 雷军、张小龙:高手的努力深入而轻松,普通人的努力肤浅而痛苦!
  2. Unity3D所使用的第三方工具
  3. Android-support-v4 v7 v8 v13 v17 的区别和特性说明
  4. CRC原理及其逆向分析方法
  5. Service Mesh 和 API Gateway 关系深度探讨
  6. java freememory 单位_Runtime类中的freeMemory,totalMemory,maxMemory区别
  7. 逻辑回归(Logistic Regression, LR)又称为逻辑回归分析,是分类和预测算法中的一种。通过历史数据的表现对未来结果发生的概率进行预测。例如,我们可以将购买的概率设置为因变量,将用户的
  8. How to set up native subversion (javahl) with Subclipse on Mac OS X
  9. 机器学习算法优缺点对比及选择
  10. concatenate python_python中numpy.concatenate()函数的使用
  11. UnityWebform(2):自定义LifetimeManager和TypeConverter使Unity从HttpContext中取值注入WebForm页面...
  12. 电子设计竞赛应该如何准备?
  13. javascript延时setTimeOut与定时setInterval函数区别
  14. PHP图片与文字合成
  15. 如何搭建威纶通触摸屏与S7-200smart之间无线PPI通信?
  16. 帮助机器人自由行走 思岚科技推出激光导航模块
  17. LiveZilla-最好的免费在线客服介绍和详细说明
  18. 释放docker日志所占空间
  19. heading pitch bank
  20. vivo手机的android系统,vivo X3S的手机系统是什么?能升级安卓4.3吗?

热门文章

  1. android版本怎么升级10,荣耀10怎么升级EMUI10系统
  2. 【vue-element-admin】4.x 添加 i18n 国际化多语言切换
  3. C++课程设计 通讯录管理系统 原码及解析
  4. 英语单词的形象联想组合记忆法
  5. 新店速递|白玉兰(商务)酒店福州火车站西湖长冠店 正式上线
  6. 瑞幸咖啡的最终目标并不是做国内市场大哥
  7. c语言学生成绩统计问题分析,统计计算学生成绩类有关问题ACing
  8. moxa uport1150串口驱动下载地址及安装方式
  9. 互联网里的东邪、西毒、南帝、北丐
  10. Web Scalability for Startup Engineers TipTechniques for Scaling You Web Application --读书笔记