并查集代码分析
2020-07-20 04:11
120 查看
并查集
并查集是啥子?
- 并查集支持查找一个元素所属的集合,还可以将两个不在一个集合的元素合并。
- 举个栗子,你有家谱去看看到底是不是亲戚。当你的家谱非常庞大,是个大湾子,但是你可以使用并查集来看看你们是不是一个祖宗。
并查集需要那几样东西?
- 需要一个数组pre
。 - void join(int m,int n)函数,也就是合并函数。
- int find(itn x)函数。
数组pre
pre
的具体意思pre
的值表示n的上头,
当pre[4]=8,表示8是4他爸妈。
当一开始,我们没有查家谱,我们就认定自己是自己的祖宗pre[i]=i
int find(int x)函数。
返回值 :find(int x)函数返回自己的祖宗。
就是往一直往自己上头找,知道发现pre[i]==i
表示你找到祖宗了,就返回祖宗。
int find(int n)//找老大 { int root,son,temp; root=n; son=n; while(root!=pre[root]) root=pre[root]; return root; }
这个算法还可以进行一下简化。
具体
int find(int n)//找祖宗 { int root,son,temp; root=n; son=n; while(root!=pre[root]) root=pre[root]; while(son!=root)//压缩一下,直接将所有的人 //直接指向他的祖宗。 { temp=pre[son]; pre[son]=root; son=temp; } return root; }
void join(int m,int n)函数
这个函数用于将m和n联合起来,表示他们有一个祖宗。
void join(int m,int n) { int i,j; i=find(m);//找到i的祖宗 j=find(n); if(i!=j)//两个祖宗相互比较 pre[i]=j;//不同就把一个祖宗归到另一个祖宗, //也就是认别人为祖宗。 }
最后出个题。
- 先输入两个数,
- 一个是家谱中查出有多少个关系,
- 一个是有多少人
- 后面一次输入家谱中查出的关系
- 最后输出有多少个家族?
#include<iostream> using namespace std; int pre[100]; int find(int n) { int root,son,temp; root=n; son=n; while(root!=pre[root]) root=pre[root]; while(son!=root) { temp=pre[son]; pre[son]=root; son=temp; } return root; } void join(int m,int n) { int i,j; i=find(m); j=find(n); if(i!=j) pre[i]=j; } int main() { int m,n,a,b,k; cin>>m>>n; k=n; for(int i=1;i<=n;i++) pre[i]=i; for(int i=0;i<m;i++) { cin>>a>>b; if(find(a)!=find(b)) k--;//找到一个,认一个祖宗,也就是合并一个家族。 join(a,b); } cout<<k-1<<endl; }
相关文章推荐
- Zju 1268 Is It A Tree?解题分析(附:HDOJ 1325 并查集参考代码)
- [BuildRelease]C++代码静态分析工具splint
- 浅谈SQL Server所实现创建分页功能的存储过程的分析及代码
- c++反汇编代码分析--偷调函数
- Linux操作系统的权限代码分析
- Java NIO原理图文分析及代码实现
- ios block彻底理清之代码分析
- Monkey源码分析2—Monkey代码如何被启动执行
- boa源码分析(3)--代码结构
- FFMPeg代码分析:AVCodec结构体以及编解码器的查找和加载
- SDL2源代码分析8:视频显示总结
- Android RIL代码详细分析
- 关于一个爬虫的代码分析
- MediaInfo源代码分析 5:JPEG解析代码分析
- OpenDPI-1.3.0源代码分析
- 机器狗”病毒驱动部分逆向分析注释(C代码)
- FreeSWITCH代码分析
- 两行代码的并查集
- 1、FCN_TensorFlow——VGG16_FCN8s构造代码分析
- 考勤系统代码分析——主页布局easyui框架