高阶数据结构并查集

目录:

并查集的概念

将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中反复遇到查询某一个元素属于那个集合的运算,这种抽象的数据类型称为并查集。
主要思想:用集合中的一个元素代表集合。

代码实现

cpp 复制代码
#include<iostream>
#include<vector>
class UnionFindSet
{
public:
	UnionFindSet(size_t n)//构造函数
		:_ufs(n,-1)
	{}
	void Union(int x1,int x2)//合并根
	{
		int root1 = FindRoot(x1);
		int root2 = FindRoot(x2);
		if (root1 == root2)//如果本身在一个集合就没必要合并了	
			return;
			
		_ufs[root1] += _ufs[root2];//2个下标相加
		_ufs[root2] = root1;//存一下根的下标
		
	}
	int FindRoot(int x)//查找根
	{ 
		int parent = x;
		while (_ufs[parent] >= 0)//说明不是根
		{
			parent = _ufs[parent];
		}
		return parent;//f返回的编号是负数就是根
	}
	bool InSet(int x1, int x2)
	{
		return FindRoot(x1) == FindRoot(x2);//相等说明同一个根在同一个集合
	}
	size_t SetSize()//有几个集合
	{
		size_t size = 0;
		for (size_t i = 0; i < _ufs.size(); ++i)
		{
			if (_ufs[i] < 0)//判断有几个负数就有几个集合,因为负数是根
			{
				++size;
			}
		}
		return size;
	}

private:
	vector<int> _ufs;//编号找人 
};

LeetCode例题

例题一:

  1. 省份数量

有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。省份是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个 n x n 的矩阵 isConnected ,其中 isConnectedij = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnectedij = 0 表示二者不直接相连。返回矩阵中省份的数量。

示例 1:

输入:isConnected = \[1,1,0,1,1,0,0,0,1]

输出:2

示例 2:

输入:isConnected = \[1,0,0,0,1,0,0,0,1]

输出:3

提示:

1 <= n <= 200

n == isConnected.length

n == isConnectedi.length

isConnectedij 为 1 或 0

isConnectedii == 1

isConnectedij == isConnectedji

代码解答:

cpp 复制代码
class Solution {
public:
    int findCircleNum(vector<vector<int>>& isConnected) {
      vector<int> ufs(isConnected.size(),-1);
      //手动函数
      auto findRoot=[&ufs](int x)
      {
         while(ufs[x]>=0)//是负数才是根
         
             x=ufs[x];
             return x;    
      };
      for(size_t i=0;i<isConnected.size();++i)
      {
          for(size_t j=0;j<isConnected[i].size();++j)
          {
              if(isConnected[i][j]==1)
              {
                  //合并集合
                 int root1=findRoot(i);
                 int root2=findRoot(j);
                 if(root1!=root2)
                 {
                     ufs[root1]+=ufs[root2];
                     ufs[root2]=root1;//root2变成root1的孩子,root2的下标存的是root1是0
                 }

              }
          }
      }
         int n=0;
         for(auto e: ufs)
         {
             if(e<0)
             ++n;
         }
         return n;
    }
};

例题二:

  1. 等式方程的可满足性

给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equationsi 的长度为 4,并采用两种不同的形式之一:"a等于b" 或 "a!=b"。在这里,a 和 b 是小写字母(不一定不同),表示单字母变量名。只有当可以将整数分配给变量名,以便满足所有给定的方程时才返回 true,否则返回 false。

代码解答:

cpp 复制代码
class Solution {
public:
    bool equationsPossible(vector<string>& equations) {
        vector<int> ufs (26,-1);//26个字母的映射关系
        auto findRoot=[&ufs](int x)
        {
           while(ufs[x]>=0)
           x=ufs[x];
           return x;
        };
        for(auto& str: equations)
        {
          if(str[1]=='=')
          {
              int root1=findRoot(str[0]-'a');
              int root2=findRoot(str[3]-'a');
               if(root1!=root2)
               {
                   ufs[root1]+=ufs[root2];
                   ufs[root2]=root1;//root2变成root1的孩子
               }         
          }
          
        }
//判断不相等的在不在一个集合,在就相悖并返回false
           for(auto& str: equations)
        {
          if(str[1]=='!')
          {
              int root1=findRoot(str[0]-'a');
              int root2=findRoot(str[3]-'a');
               if(root1==root2)
               {
                 return false;
               }             
          }

        }
     return true;
    }
};
相关推荐
txzrxz2 分钟前
拓补排序讲解
c++·算法·图论·排序
深圳市快瞳科技有限公司9 分钟前
宠物行为识别:将日常行为转化为可量化的健康指标
人工智能·算法·计算机视觉·宠物
稚南城才子,乌衣巷风流28 分钟前
长链剖分(Long Chain Decomposition)算法详解
算法·深度优先·图论
变量未定义~40 分钟前
环境治理、染色时间、小蓝组网
算法
Ulyanov1 小时前
雷达导引头仿真中的坐标系——从惯性系到量测角
开发语言·python·算法·系统仿真·雷达信号处理·雷达导引头
玖玥拾1 小时前
LeetCode 13 罗马数字转整数
笔记·算法·leetcode
m沐沐2 小时前
【计算机视觉】OpenCV 物体跟踪——原理、算法与CSRT跟踪器实战
人工智能·python·深度学习·opencv·算法·计算机视觉·人脸识别
起个破名想半天了2 小时前
算法与数据结构之Kruskal算法
数据结构
怪奇云呼军2 小时前
闪电智能 Voice Agent 怎样根据语速、停顿和追问方式切换话术?策略引擎拆解
开发语言·人工智能·网络协议·算法·语音识别·web app
稚南城才子,乌衣巷风流2 小时前
树链剖分(树剖)算法详解:从原理到实现
算法·深度优先