美文网首页
C++ 实现并查集

C++ 实现并查集

作者: VGSemir | 来源:发表于2019-02-17 22:23 被阅读0次
并查集

并查集实际上就是并集和查集的过程。集(集合)可以理解为一棵树,即一个根结点连着无数个子节点。

例题解析

输入格式:
第一行包含两个整数N、M,表示共有N个元素和M个操作。
接下来M行,每行包含三个整数Zi、Xi、Yi
当Zi=1时,将Xi与Yi所在的集合合并
当Zi=2时,输出Xi与Yi是否在同一集合内,是的话输出Y;否则话输出N
输出格式:
如上,对于每一个Zi=2的操作,都有一行输出,每行包含一个大写字母,为Y或者N
输入输出样例
输入样例:
4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4
输出样例:
N
Y
N
Y

AC代码如下
test.cpp

#include <fstream>

#include <iostream>
#include <string>

using namespace std;

int findFather(int *father, int x) {
    int i = x;
    while (father[i] != i) {
        i = father[i];
    }
    return i;
}

void gather_union(int *father, int x, int y) {
    int fx = findFather(father, x);
    int fy = findFather(father, y);
    if (fx != fy) {
        father[fx] = fy;
    }
}

int main() {
    ifstream infile;
    infile.open("input.txt");

    int num, num_oper;
    infile >> num >> num_oper;
    int *father = new int[num + 1];
    for (int i = 1; i <= num; i++) {  //初始化 将祖先设为自己
        father[i] = i;
    }

    int oper, x, y;
    for (int i = 0; i < num_oper; i++) {
        infile >> oper >> x >> y;
        if (oper == 1) {
            gather_union(father, x, y);
        }
        else {
            int fx = findFather(father, x);
            int fy = findFather(father, y);
            if (fx == fy) {
                cout << "Y" << endl;  //x和y同属一个集合
            }
            else {
                cout << "N" << endl;  //x和y不属于同一集合
            }
        }
    }


    infile.close();
    return 0;
}

input.txt

4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4



初始化
并查集要有一个记录每个节点的根节点的地址 (father[]),开始时将每个节点独立开来,(后面再进行合并操作)

int *father = new int[num + 1];
for (int i = 1; i <= num; i++) {  //初始化 将祖先设为自己
    father[i] = i;
}

查找
查找一个元素再其所在集合中的根节点(father),可用来判断两个元素是否再同一个集合当中
当一个节点的father是它本身,则说明该节点是该集合的根节点

int findFather(int *father, int x) {
    int i = x;
    while (father[i] != i) {
        i = father[i];
    }
    return i;
}

合并
将两个集合合并起来,即将一个集合的根节点的father设为另一个集合的根节点,从而两个集合拥有相同的根节点,即合并为同一个集合

void gather_union(int *father, int x, int y) {
    int fx = findFather(father, x);
    int fy = findFather(father, y);
    if (fx != fy) {
        father[fx] = fy;
    }
}



应用: PTA L2-010

相关文章

  • C++ 实现并查集

    并查集 并查集实际上就是并集和查集的过程。集(集合)可以理解为一棵树,即一个根结点连着无数个子节点。 例题解析 输...

  • c++中并查集实现

    何谓并查集 并查集实际上就是并集和查集的过程。那么什么是集呢?你可以把他近似地理解为一棵树。即一个根结点连着无数个...

  • 并查集的C++实现

    这里只写了实现和应用。 理论部分可以参考下面的链接:https://zh.wikipedia.org/wiki/%...

  • 并查集练习

    并查集 参考《算法笔记》 三要素:并,查,集。 并差集与一个算法有关,kruskal算法,就可通过并查集实现。 1...

  • 数据结构与算法(十二)并查集(Union Find)

    本文主要包括以下内容: 并查集的概念 并查集的操作 并查集的实现和优化Quick FindQuick Union基...

  • 算法与数据结构系列之[并查集-中]

    上篇介绍了并查集的基本实现,这篇介绍几种并查集的优化方法。 1.基于size优化: 上一篇当中树实现并查集的方法中...

  • LeetCode 分类刷题 —— Union Find

    Union Find 的 Tips: 灵活使用并查集的思想,熟练掌握并查集的模板,模板中有两种并查集的实现方式,一...

  • Golang实现并查集

    模拟C++实现了一个并查集,主要是理解连通图的原理。main.go utils/union_find_set.go...

  • markdown学习

    #并查集 ##并查集的定义 ##并查集的操作

  • 高级数据结构:并查集(Java 实现)

    并查集的内容非常简单,代码的每个方法的实现都很短,难在灵活应用。 并查集基础 为什么叫并查集?因为在这个数据结构中...

网友评论

      本文标题:C++ 实现并查集

      本文链接:https://www.haomeiwen.com/subject/dibneqtx.html