[Estructura de datos] Implementación en C ++ de Disjoint Set Union

// Correspondiente al tema de leetcode: Sword Pointer Offer II 118. Bordes adicionales
La función de la búsqueda de unión: verificar si hay un ciclo en el gráfico no dirigido
Método de implementación: usar un árbol para representar el conjunto y construir el árbol en la forma de una matriz, buscando una arista La relación entre los nodos raíz de dos vértices determina si hay un ciclo, si son
diferentes significa que los dos conjuntos se pueden conectar a través de la arista actual, es decir, pertenecen a el mismo conjunto. En este momento, los dos árboles se fusionan (temporalmente simplemente cuelgue un nodo raíz debajo del otro nodo raíz);
si son iguales: significa que los dos puntos están en el mismo conjunto, lo que indica que hay un ¡ciclo!

Implementación ingenua de C ++:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

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

        return ret;

    }
    bool insert(vector<int>& 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<int> check_circle(vector<vector<int>>& edges) 
    {
    
    
        int n = edges.size();
        vector<int> parent(n, -1);
        for(int i=0; i<n; i++) {
    
    
            insert(parent, edges[i][0], edges[i][1]);
        }

        return ans;
    }
};

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


    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/ayitime/article/details/126677458
Recomendado
Clasificación