首页 > 其他分享 >并查集

并查集

时间:2024-12-28 15:20:01浏览次数:7  
标签:查集 unionSets int findParent fa initialize

并查集模板:

#include <iostream>
#include <vector>

using namespace std;

// 初始化父节点数组
vector<int> fa;

// 查找根节点并进行路径压缩
int findParent(int x) {
    if (x == fa[x]) return x;
    return fa[x] = findParent(fa[x]);
}

// 合并两个集合
void unionSets(int x, int y) {
    fa[findParent(x)] = findParent(y);
}

// 初始化并查集
void initialize(int n) {
    fa.resize(n);
    for (int i = 0; i < n; ++i) {
        fa[i] = i;
    }
}

int main() {
    int n = 10; // 假设有10个元素
    initialize(n);

    // 示例操作
    unionSets(1, 2);
    unionSets(3, 4);
    unionSets(2, 4);

    // 检查是否在同一个集合中
    if (findParent(1) == findParent(3)) {
        cout << "1 and 3 are in the same set." << endl;
    } else {
        cout << "1 and 3 are in different sets." << endl;
    }

    if (findParent(1) == findParent(5)) {
        cout << "1 and 5 are in the same set." << endl;
    } else {
        cout << "1 and 5 are in different sets." << endl;
    }

    return 0;
}

 

标签:查集,unionSets,int,findParent,fa,initialize
From: https://www.cnblogs.com/AnnaStore/p/18637526

相关文章

  • 带权并查集
    #include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'#definexfirst#defineysecond#defineintlonglongconstintN=1e6+10,mod=998244353;intf[N],w[N];//w[i]表示i这个点比根节点的值大多少intfind(intx){ if(f[x]==x)returnx; intp......
  • 代码随想录算法训练营第五十五天|并查集理论基础、寻找存在的路径
    前言打卡代码随想录算法训练营第49期第五十五天(~ ̄▽ ̄)~首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。学习今天的课程前,先看并......
  • 开拓计划4 - 二叉树与并查集
    开拓计划4-二叉树与并查集二叉树二叉树的概念Q:什么是树?A:一种有\(n\)个节点最多有\(n-1\)条边的图。Q:什么是二叉树?A:每个节点都最多只有两个子节点的树。二叉树和递归Q:二叉树和递归有什么关系?A:在执行递归的时候总是会自己调用自己,每一次调用都会产生新的一层,新......
  • NKOJ 1209 并查集【NOI2001 Day1 T3】食物链
    NKOJ1209并查集【NOI2001Day1T3】食物链思路:带权/种类并查集方法一实现方法用带权并查集带的权值是边权,不是点权,用来表示两点间的关系,但为了方便记录还是用点权,每个点记录到根节点的权值。在getf函数中注意更新是到根节点之间的权值,用\(val_x=(val_x+val_{fa_x})\bm......
  • NKOJ 2107 【并查集】可爱的猴子
    NKOJ2107【并查集】可爱的猴子思路:普通并查集+图的遍历更新答案实现方法首先使用时光倒流思想解决删边的问题。注意提前把没有删过的边提前建上。接着用一个图记录猴子之间的拉手关系,每次要更新答案时都遍历与当前节点连着的节点将其答案更新,只有在\(1\)号节点与当前节......
  • XDOJ 735 最小生成树 (Kruskal+并查集)
    标题最小生成树时间限制2S内存限制10000Kb问题描述:用克鲁斯卡尔(Kruskal)算法求无向网的最小生成树。输入:输入数据第一行为两个正整数n(1<n<=30)和m(1<m<100),分别表示顶点数和边数。后面紧跟m行数据,每行数据是一条边的信息,包括三个数字,分别表示该边的两个顶点和边上的权值......
  • 并查集模板(map保存负数下标)
    classSolution{unordered_map<int,int>fa,rank;voidinit(unordered_set&set){for(constauto&num:set){fa[num]=num;rank[num]=1;}}intfinds(intx){if(x!=fa[x]){fa[x]=finds(fa[x]);}returnfa[x];}voidunions(intx,inty){introotx=f......
  • 【唐叔学算法】第八天:并查集-图论连通性的大杀器
    你是否曾为如何高效地解决图论中的连通性问题而烦恼?并查集算法,就像一张无形的网,能帮你轻松连接所有节点。今天,就让我们一起揭开并查集算法的神秘面纱,探索它在Java编程中的应用。并查集是什么?并查集(Union-Find)是一种数据结构,用于处理一些不交集的合并及查询问题。它支持两......
  • 并查集学习笔记
    一、例题引入洛谷P3367【模板】并查集题目描述如题,现在有一个并查集,你需要完成合并和查询操作。输入格式第一行包含两个整数$N,M$,表示共有$N$个元素和$M$个操作。接下来$M$行,每行包含三个整数$Z_i,X_i,Y_i$。当$Z_i=1$时,将$X_i$与$Y_i$所在的集合合并。......
  • 每日一道算法题之并查集之移除最多的同行或同列石头
    importjava.util.HashMap;classSolution{publicstaticHashMap<Integer,Integer>row=newHashMap<>();publicstaticHashMap<Integer,Integer>col=newHashMap<>();publicstaticintMAXN=1001;publicstati......