当前位置: 首页 > news >正文

开通腾讯企业邮箱入口优化工作流程

开通腾讯企业邮箱入口,优化工作流程,erp网站建设,两学一做注册网站吗并查集一.并查集的原理二.并查集的实现三.并查集的应用1.省份数量2. 等式方程的可满足性一.并查集的原理 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素…

并查集

  • 一.并查集的原理
  • 二.并查集的实现
  • 三.并查集的应用
    • 1.省份数量
    • 2. 等式方程的可满足性

一.并查集的原理

在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-findset)

例如:有十个小朋友,他们两两之间可能存在直接的朋友关系,现在需要判断其中任意两个人是否是朋友(因为朋友的朋友也是朋友,所以不一定是直接的朋友关系
现给这些小朋友进行编号:{0, 1, 2, 3,4, 5, 6, 7, 8, 9};给以下数组用来存储该小集体
在这里插入图片描述
集合的树形表示:
在这里插入图片描述
从图中可以看出1,2,4,7是一组朋友,3,5,8是第二组,6,9,10是第三组,因此我们可以这样表示这些集合:
在这里插入图片描述
如果数组中的值为-1,表示这个节点就是这个集合的根,大于0则指向他的父节点。

通过上面这个例子,可以看出并查集适合解决这些问题:

  1. 查找元素属于哪个集合
    沿着数组表示树形关系以上一直找到根(即:树中中元素为负数的位置)
  2. 查看元素是否属于同一集合
    沿着数组表示的树形关系往上一直找到树的根,如果根相同表明在同一个集合,否则不在
  3. 将两个集合合并
    找到两个集合的根,将其中一个根节点的父节点改为另一个根节点。
  4. 集合的个数
    遍历数组,数组中元素为负数的个数即为集合的个数。

二.并查集的实现

#include <iostream>
#include <vector>template <class T>
class UnionFindSet
{
public:UnionFindSet(size_t n): _ufs(n, -1){}// 查找index在哪个集合中void FindRoot(int index){int root = index;while(_ufs[root] >= 0){root = _ufs[root];}return root;}// 合并两个集合bool Union(int x,int y){int root1 = FindRoot(x);int root2 = FindRoot(y);if(root1 == root2)return false;_ufs[root1] += _ufs[root2];_ufs[root2] = root1;return true;}// 获取集合个数size_t Count(){size_t cnt = 0;for(auto &e : _ufs){if(e < 0){++cnt;}}return cnt;}private:std::vector<int> _ufs;
};

三.并查集的应用

1.省份数量

链接: 力扣

int FindRoot(vector<int>& ufs,int x)
{int root = x;while(ufs[root] >= 0){root = ufs[root];}return root;
}class Solution {
public:int findCircleNum(vector<vector<int>>& isConnected) {int n = isConnected.size();vector<int> ufs(n,-1);for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){if(isConnected[i][j] == 1){int root1 = FindRoot(ufs,i);int root2 = FindRoot(ufs,j);if(root1 == root2){continue;}ufs[root1] += ufs[root2];ufs[root2] = root1;}}}int n = 0;for(auto &e:ufs){if(e < 0){++n;}}return n;}   
};

2. 等式方程的可满足性

链接: 力扣

class Solution {
public:bool equationsPossible(vector<string>& equations) {int n = equations.size();vector<int> ufs(26, -1);auto findRoot = [&ufs](int x) -> int {while (ufs[x] >= 0) {x = ufs[x];}return x;};for (int i = 0; i < n; i++) {if (equations[i][1] == '=') {int root1 = findRoot(equations[i][0] - 'a');int root2 = findRoot(equations[i][3] - 'a');if (root1 != root2) {ufs[root2] = root1;}}}for (int i = 0; i < n; i++) {if (equations[i][1] == '!') {int root1 = findRoot(equations[i][0] - 'a');int root2 = findRoot(equations[i][3] - 'a');if (root1 == root2) {return false;}}}return true;}
};
http://www.dtcms.com/a/493989.html

相关文章:

  • 网站开发商可以代刷好评吗网站开发公司兴田德润在那里
  • 外贸网站如何选择域名wordpress设置网站导航
  • 常州行业网站企业电子商务网站建设策划书
  • 企业自建网站缺网络游戏排行榜前十手游
  • 集团网站建设多少钱好的网站建设商家
  • 苏州专业网站制作方案创意网红墙图片
  • 成功的营销型网站设计特点本地建站教程
  • 网站建设文化教程怎样做网站地图
  • 手机网站制作明细报价表扫码可见wordpress
  • 电子商务网站建设 百度文库东莞做网站首选
  • 手机传奇手游发布网站给wordpress添加表单
  • 图书网站开发网站 封锁右键
  • 淘外网站怎么做找客户的十大方法
  • 越秀低价网站建设网上学编程哪个培训班最好
  • 创科手机网站网站流量成本
  • 网红营销分析山东进一步优化
  • 免费网站后台模板建网站好还是开天猫好
  • 企业网站源码asp登录不上wordpress
  • 怎样开设网站wordpress 替换图片不显示
  • 广东微信网站制作报价表怎样做模具钢网站
  • 大型网站开发用什么语言wordpress if include
  • 甘肃省建设厅官方网站质监局福建建设厅网站首页
  • 建设部门网站在青岛建网站
  • 提供秦皇岛网站建设上海网站开发与
  • 中原彼得堡航空学院网站的建设网站用户体验分析怎么做
  • 租车公司网站 模板资讯网站如何做聚合
  • 设计网站的素材企业网站制作托管
  • 几何背景生成器网站徐州网站建设电话
  • 青岛网站建设兼职上海哪家seo好
  • 做男女的那个视频网站新郑网站优化