并查集(Union-Find)

    并查集是一种数据结构,主要用于解决一些元素分组的问题。它支持两种操作:查找和合并。查找操作用于判断两个元素是否属于同一组,合并操作用于将两个元素所在的组进行合并。并查集可以用于解决一些经典的算法问题,如最小生成树、网络连通性等。

一、并查集的实现原理

并查集的基本思想是:每个元素都有一个父节点,如果两个元素的父节点相同,那么它们就属于同一个集合。初始时,每个元素都是一个独立的集合,其父节点就是自己。

1. 查找操作:查找元素所在集合的代表元素(根节点)。从给定元素开始,沿着父节点链一直向上查找,直到找到根节点。在查找过程中,可以将路径上的所有元素的父节点都直接指向根节点,以优化后续查找操作。

2. 合并操作:将两个元素所在的集合进行合并。首先分别查找两个元素所在的根节点,然后将其中一个根节点的父节点设置为另一个根节点。

二、代码实现:

#include <stdio.h>

// 定义并查集结构体
typedef struct {
    int parent; // 父节点
    int rank;   // 树的高度
} UnionFind;

// 初始化并查集
void initUnionFind(UnionFind *uf, int n) {
    for (int i = 0; i < n; i++) {
        uf[i].parent = i;
        uf[i].rank = 0;
    }
}

// 查找操作,返回元素的根节点
int find(UnionFind *uf, int x) {
    if (uf[x].parent != x) {
        uf[x].parent = find(uf, uf[x].parent); // 路径压缩
    }
    return uf[x].parent;
}

// 合并操作,将两个元素所在的集合进行合并
void unionSet(UnionFind *uf, int x, int y) {
    int rootX = find(uf, x);
    int rootY = find(uf, y);
    if (rootX == rootY) {
        return;
    }
    if (uf[rootX].rank > uf[rootY].rank) {
        uf[rootY].parent = rootX;
    } else if (uf[rootX].rank < uf[rootY].rank) {
        uf[rootX].parent = rootY;
    } else {
        uf[rootY].parent = rootX;
        uf[rootX].rank++;
    }
}

int main() {
    int n = 5;
    UnionFind uf[n];
    initUnionFind(uf, n);

    unionSet(uf, 0, 1);
    unionSet(uf, 2, 3);
    unionSet(uf, 3, 4);

    for (int i = 0; i < n; i++) {
        printf("Element %d: parent = %d, rank = %d
", i, uf[i].parent, uf[i].rank);
    }

    return 0;
}

相关推荐

  1. Union-Find

    2024-04-27 11:04:05       15 阅读
  2. Union-Find)介绍

    2024-04-27 11:04:05       16 阅读
  3. LeetCode2092. Find All People With Secret——

    2024-04-27 11:04:05       29 阅读
  4. Union-Find

    2024-04-27 11:04:05       44 阅读
  5. 【C++】

    2024-04-27 11:04:05       29 阅读
  6. 笔记

    2024-04-27 11:04:05       22 阅读
  7. <span style='color:red;'>并</span><span style='color:red;'>查</span><span style='color:red;'>集</span>

    2024-04-27 11:04:05      15 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-27 11:04:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-27 11:04:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-27 11:04:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-27 11:04:05       20 阅读

热门阅读

  1. 前端面试(争取日更版)(一)

    2024-04-27 11:04:05       20 阅读
  2. 边缘计算概述_1.边缘计算概念和定义

    2024-04-27 11:04:05       13 阅读
  3. CPP语法(六)——函数模板

    2024-04-27 11:04:05       13 阅读
  4. android11 加入GMS后修改launcher图标顺序

    2024-04-27 11:04:05       11 阅读
  5. 用asio::tcp通信的服务端

    2024-04-27 11:04:05       14 阅读
  6. MATLAB初学者入门(20)—— 预编码算法

    2024-04-27 11:04:05       12 阅读
  7. Python常见数据结构

    2024-04-27 11:04:05       13 阅读
  8. 编写一款2D CAD/CAM软件(十八)框选图形

    2024-04-27 11:04:05       12 阅读