栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

【数据结构】 C++实现并查集 (Disjoint Set Union)

Java 更新时间:发布时间: 百科书网 趣学号

// 对应leetcode题目:剑指 Offer II 118. 多余的边
并查集的作用:检查无向图中是否存在环
实现方式:用树来表示集合,并以数组的方式建树,通过查找一个边的两个顶点的根节点的关系判断是否存在环,
若不同,则说明这两个集合是可以通过当前当前的边建立起联系的,即他们属于同一个集合,这时将两棵树合并(暂时简单的将一个根节点挂在另一个根节点下面);
若相同:则说明这两个点在同一个集合内,说明存在了环!

C++的naive实现:

#include 
#include 
#include 
using namespace std;

class Solution{
public:
    vector ans;
    int get_parent(vector& parent, int pos) {      // 若节点无父节点,返回-1
        int ret = pos;
        while(parent[ret] != -1) {
            ret = parent[ret];
        }

        return ret;

    }
    bool insert(vector& parent, int a, int b) {
        int p_a = get_parent(parent, a);
        int p_b = get_parent(parent, b);
        if(p_a == p_b) {
            this->ans = {a, b};
            return false;
        }
        else       // union
            parent[p_a] = p_b;      // a接在b下面
        
        return true;
    }

    vector check_circle(vector>& edges) 
    {
        int n = edges.size();
        vector parent(n, -1);
        for(int i=0; i
            insert(parent, edges[i][0], edges[i][1]);
        }

        return ans;
    }
};

int main()
{
    // 通过 删掉一个边形树(无环图)。若有多种删除方法, 则按照在edges中出现的顺序,返回最后出现的
    vector> edges = {{0, 1}, {1, 2}, {3, 4}, {2, 4}, {1, 3}, {2, 5}};
    Solution base;
    vector ans = base.check_circle(edges);


    return 0;
}
转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/1073413.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号