在算法和数据结构的世界中,C语言并查集(Union-Find Set)是一种非常高效且实用的数据结构,特别适用于处理动态连通性问题。例如:判断两个节点是否连通、合并两个集合、社交网络中的好友关系等。
本教程将带你从零开始,用通俗易懂的方式讲解并查集数据结构的原理、实现与优化,即使你是编程小白,也能轻松掌握!
并查集(Union-Find Set)是一种树形结构,用于管理若干不相交集合(Disjoint Sets)。它支持两种核心操作:
Find(x):查找元素 x 所在集合的代表(根节点)。Union(x, y):将元素 x 和 y 所在的集合合并为一个集合。想象一下:你有一群人,初始时每个人都是独立的“帮派”。当两个人成为朋友,就把他们的帮派合并。并查集就是用来高效管理这种“合并”和“查询是否同帮派”的工具。

我们用一个整型数组 parent[] 来表示每个元素的父节点。初始时,每个元素的父节点是自己,即 parent[i] = i。
void init(int parent[], int n) { for (int i = 0; i < n; i++) { parent[i] = i; // 每个元素初始时自成一个集合 }}int find(int parent[], int x) { while (parent[x] != x) { x = parent[x]; } return x;}这个版本的 find 是最朴素的,时间复杂度在最坏情况下可能达到 O(n)。
void unionSet(int parent[], int x, int y) { int rootX = find(parent, x); int rootY = find(parent, y); if (rootX != rootY) { parent[rootX] = rootY; // 将 rootX 的父节点设为 rootY }}为了提升效率,我们可以对并查集进行两种经典优化:
find 时,将路径上的所有节点直接指向根节点,减少后续查找时间。#include <stdio.h>#include <stdlib.h>#define MAXN 1000int parent[MAXN];int rank[MAXN]; // 用于记录树的高度(秩)// 初始化void init(int n) { for (int i = 0; i < n; i++) { parent[i] = i; rank[i] = 0; }}// 带路径压缩的 findint find(int x) { if (parent[x] != x) { parent[x] = find(parent[x]); // 递归压缩路径 } return parent[x];}// 按秩合并的 unionvoid unionSet(int x, int y) { int rootX = find(x); int rootY = find(y); if (rootX == rootY) return; // 将低秩树合并到高秩树下 if (rank[rootX] < rank[rootY]) { parent[rootX] = rootY; } else if (rank[rootX] > rank[rootY]) { parent[rootY] = rootX; } else { parent[rootY] = rootX; rank[rootX]++; // 秩相等时,合并后高度+1 }}// 示例:判断两个元素是否在同一集合int isConnected(int x, int y) { return find(x) == find(y);}// 主函数测试int main() { int n = 5; init(n); unionSet(0, 1); unionSet(2, 3); unionSet(1, 2); printf("0 和 3 是否连通? %s\n", isConnected(0, 3) ? "是" : "否"); printf("0 和 4 是否连通? %s\n", isConnected(0, 4) ? "是" : "否"); return 0;}经过优化后,并查集的每次操作平均时间复杂度接近常数级别(阿克曼函数的反函数),效率极高!
通过本篇并查集教程,你应该已经掌握了 C 语言中并查集实现的基本方法和优化技巧。记住:初始化、Find、Union 是三大核心,而路径压缩与按秩合并是性能的关键。
多加练习,你就能在各类算法竞赛或工程问题中灵活运用这一强大工具!
如果你觉得这篇教程有帮助,欢迎分享给更多学习 C语言并查集 的小伙伴!
本文由主机测评网于2025-12-10发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025125796.html