并查集的基本思想:将具有一定联系的节点,凑成一个集合
官方解释:并查集(Union-find Data Structure)是一种树型的数据结构。它的特点是由子结点找到父亲结点,用于处理一些不交集(Disjoint Sets)的合并及查询问题。
Find:确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。
Union:将两个子集合并成同一个集合。
例题1:有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。
省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。
给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。
返回矩阵中 省份 的数量。(力扣:547)

// 使用并查集来解题:
// 什么是并查集简单的来说就是使用:按照一定的规则为连通在一起的节点选出一个公共的符父节点,
// 然后再寻找集合中有多少个父节点
class Solution {
public int findCircleNum(int[][] isConnected) {
int len=isConnected.length;
// 创建一个数组来保存当前节点的父节点
int[] parents=new int[len];
// 为每个节点初始化父节点
for(int i=0;i<len;i++){
parents[i]=i;
}
// 寻找由联系的节点为他们选出父节点
for(int i=0;i<len;i++){
for(int j=0;j<isConnected[0].length;j++){
if(isConnected[i][j]==1){
// 如果他们之间有联系,则将他们合并
union(parents,i,j);
}
}
}
// 不能使用set因为有的节点的父节点是没有指向代表节点,但它的父父节点指向了代表节点
// // 合并完后看看parent数组中的不同的值有多少个,这里我们可以使用set
// Set <Integer> set=new HashSet<Integer>();
// // 将parents中的值添加道set集合中去
// for(int i=0;i<len;i++){
// set.add(parents[i]);
// }
// // 返回结果
// return set.size();
int circles = 0;
for (int i = 0; i < len; i++) {
if (parents[i] == i) {
circles++;
}
}
return circles;
}
// 创建一个合并函数,规则是由我们自己定义的,例如我们可以让两个相连的节点的后一个节点作为父节点
public void union(

本文介绍了并查集这一数据结构,并通过三个具体的例题展示了其在解决图的连通性问题,如寻找多余边、判断节点间关系等方面的有效性。并查集的主要操作包括Find和Union,用于确定元素所属集合和合并集合。通过并查集,可以高效地处理无向图的连通性问题,从而在算法竞赛和实际编程中得到广泛应用。
最低0.47元/天 解锁文章
23万+

被折叠的 条评论
为什么被折叠?



