并查集(两个优化—按秩合并、路径压缩) poj2492
来源:互联网 发布:及时雨淘宝客软件 编辑:程序博客网 时间:2024/06/08 04:59
并查集有两个优化。
一、按秩合并
描述:就是在对两个不同子集连接时,按照rank来连,也就是rank低的连在rank高的下面。rank高的做父亲节点。
作用,这样类似维护了一棵树,树是rank高的在上。
二、路径压缩
描述:假如fa数组已经嵌套了N层,那么传统的做法去找祖先要做N次,当N很大时,这种做法很没效率。
这是朴素查找的代码,适合数据量不大的情况:
int findx(int x)
{
int r=x;
while(parent[r] !=r)
r=parent[r];
return r;
}
下面是采用路径压缩的方法查找元素:
int find(int x) //查找x元素所在的集合,回溯时压缩路径
{
if (x != parent[x])
{
parent[x] = find(parent[x]); //回溯时的压缩路径
} //从x结点搜索到祖先结点所经过的结点都指向该祖先结点
return parent[x];
}
上面是一采用递归的方式压缩路径, 但是,递归压缩路径可能会造成溢出栈,我曾经因为这个RE了n次,下面我们说一下非递归方式进行的路径压缩:
int find(int x)题目描述:有N个虫子。科学家认为只有两只虫子不同性别时,才会发生关系。现在给你M个关系,让你判断是否存在同性恋。
{
int k, j, r;
r = x;
while(r != parent[r]) //查找跟节点
r = parent[r]; //找到跟节点,用r记录下
k = x;
while(k != r) //非递归路径压缩操作
{
j = parent[k]; //用j暂存parent[k]的父节点
parent[k] = r; //parent[x]指向跟节点
k = j; //k移到父节点
}
return r; //返回根节点的值
}
resex[x]记录的是与x性别不同的虫子。我的做法是把相同性别的虫子连在一起。下面是代码:
#include <stdio.h>#define N 2002int fa[N],rank[N],resex[N];void init(int len){int i;for(i=1;i<=len;i++){fa[i]=i;rank[i]=0;resex[i]=0;//代表与i性别相反的虫子号}}int find(int x){if(fa[x]!=x){fa[x]=find(fa[x]);//路径压缩}return fa[x];}void Union(int a,int b){int x=find(a);int y=find(b);if(rank[x]>rank[y])//按秩合并fa[y]=x;else{fa[x]=y;if(rank[x]==rank[y])rank[y]++;}}int main(){int T,n,m,i,a,b,num=0,flag;scanf("%d",&T);while(num<T){flag=1;num++;scanf("%d%d",&n,&m);init(n);for(i=1;i<=m;i++){scanf("%d%d",&a,&b);if(!flag)continue;int x=find(a);int y=find(b);if(x==y)flag=0;//当两只性别相同的虫子发生关系时,发现同性恋if(resex[a]!=0)Union(resex[a],b);//易证,a的相反性别的虫子和b性别应当相同,所以连接两者else resex[a]=b;if(resex[b]!=0)Union(resex[b],a);else resex[b]=a;}printf("Scenario #%d:\n",num);if(!flag)printf("Suspicious bugs found!\n\n");else printf("No suspicious bugs found!\n\n");}return 0;}
0 0
- 并查集(两个优化—按秩合并、路径压缩) poj2492
- 并查集(按秩合并、路径压缩)
- 并查集的“并优化”(leader合并)和“查优化”(路径压缩)
- 并查集的两个优化(秩优化+路径压缩)
- 并查集的两种优化(按秩合并,路径压缩)
- 并查集的优化:按秩合并和路径压缩
- 并查集 按秩合并&路径压缩
- 并查集的优化---路径压缩与启发式合并
- poj2492(并查集)
- Disjointset 并查集(按秩合并,与路径压缩)的模板
- 数据结构实现之并查集(使用按秩合并和路径压缩)
- 并查集讲解(按秩合并与路径压缩),模板与典型例题
- 【模板】【数据结构】并查集(路径压缩+按秩合并)
- 并查集——启发式合并,路径压缩
- 并查集(路径压缩 && 启发式合并!!!)
- POJ2524 并差集以及优化(路径压缩+按秩合并)的简洁介绍
- poj2492并查集
- poj2492(并查集)
- as3,类型默认值
- 面试经典(22)---字符串组合
- /dev/null 2>&1 详解
- Go语言学习(一):初识Golang
- 求n!的最后一位非零数
- 并查集(两个优化—按秩合并、路径压缩) poj2492
- UIView翻转和缩放
- 每天坐6小时以上,死亡率会增高——但站着工作就管用吗
- Asp.net 循环结构 数组
- HDU Key Task Key Task(三维bfs)
- 找不到qpopupmenu.h
- 第三方框架 MBProgressHUD 指示器
- 黑马程序员-java基础学习笔记
- 十個好用的 iOS 開發輔助工具與資源