并查集详解----简单、易懂
2019-10-21 15:16
831 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44162236/article/details/102664512
一、什么是并查集
个人理解:
例如可以把一个连通图上的节点等看成一个集合。
当1与2联通时,我们把1和2放在同一个集合,那么怎么把他们放在同一个集合?
这就需要一个数组f
。
其中n代表它本身,f
代表n所在的集合。
首先我们需要初始化
void csh(int n) { for(int i=1;i<=n;i++) { f[i]=i; } }
他们每一个都在自己本身的集合中
然后合并,但是在合并前我们需要先查找这两个点是否相连,这时我们就需要另一个函数find
int find(int x) { if(f[x]!=x) f[x]=find(f[x]); return f[x]; }
通过find函数,分别查找出这两个点是否再同意集合,如果不同,就需要并在一起,这时就需要
void hb(int x,int y){ x=find(x); y=find(y); if(x!=y) f[x]=y; }
通过合并函数,这两个点就编程一个集合了
其实并查集就这三个函数,只要你牢牢地记住,再难的并查集也不过是从这里演变而来的。
接下来来到例题
洛谷村村通
#include<iostream> #include<algorithm> using namespace std; int n,m,bcj[1000001]; void c(int n) { for(int i=1;i<=n;i++) bcj[i]=i; } int find(int x) { if(bcj[x]!=x) bcj[x]=find(bcj[x]); return bcj[x]; } int main() { while(cin>>n) {if(n==0) break; c(n);cin>>m; for(int i=1;i<=m;i++) { int x,y; cin>>x>>y; x=find(x); y=find(y); if(x!=y) bcj[x]=y; } for (int i=1;i<=n;i++) find(i); int a=0; for (int i=1;i<=n;i++) { if(find(i)==i) a++;} cout<<a-1<<endl; } return 0; }
相关文章推荐
- 并查集详解 简单风趣易懂(转+改)
- 并查集详解 ——图文解说,简单易懂(转)
- 详解最简单易懂的Spring Security 身份认证流程讲解
- Python中pandas透视表pivot_table功能详解(非常简单易懂)
- LapSRN详解——简单易懂的小白教学
- Python中pandas透视表pivot_table功能详解(非常简单易懂)
- 最小生成树kruskal算法详解----简单易懂
- 红黑树,超强动静图详解,简单易懂
- 最短路径详解模板-----菜鸟学习,简单易懂
- 简单易懂的状态栏使用详解(2)---状态栏改颜色
- PHP中Cookie的使用详解(简单易懂)
- 并查集详解(超级简单有趣~~就学会了)
- PHP+JS无限级可伸缩菜单详解(简单易懂)
- 一个简单易懂且实用的JQuery分页插件(jquery.page)(详解)
- Android小游戏——简单易懂单机人人对战五子棋源码详解
- linux系统目录结构详解(简单易懂)
- Jquery+AJax方法详解,绝对最简单易懂
- 【转载】C# 中的委托和事件(详解:简单易懂的讲解)
- PHP+JS无限级可伸缩菜单详解(简单易懂)
- 数据库设计三大范式详解(简单易懂)