Loic's Antwort sieht gut zu mir, aber ich brauchte, um die Eltern zu initialisieren, so dass jedes Element hatte sich als Elternteil, so dass ich die iota
Funktion, um eine aufsteigende Folge zu erzeugen, die bei 0 beginnt.
Mit Boost, und ich importierte bits/stdc++.h
und verwendet using namespace std
der Einfachheit halber.
#include <bits/stdc++.h>
#include <boost/pending/disjoint_sets.hpp>
#include <boost/unordered/unordered_set.hpp>
using namespace std;
int main() {
array<int, 100> rank;
array<int, 100> parent;
iota(parent.begin(), parent.end(), 0);
boost::disjoint_sets<int*, int*> ds(rank.begin(), parent.begin());
ds.union_set(1, 2);
ds.union_set(1, 3);
ds.union_set(1, 4);
cout << ds.find_set(1) << endl; // 1 or 2 or 3 or 4
cout << ds.find_set(2) << endl; // 1 or 2 or 3 or 4
cout << ds.find_set(3) << endl; // 1 or 2 or 3 or 4
cout << ds.find_set(4) << endl; // 1 or 2 or 3 or 4
cout << ds.find_set(5) << endl; // 5
cout << ds.find_set(6) << endl; // 6
}
Ich änderte std::vector
a std::array
weil das Hinzufügen von Elementen zu einem Vektor dazu führt, dass dieser seine Daten neu zuweist, wodurch die Verweise, die das Objekt disjunkte Mengen enthält, ungültig werden.
Soweit ich weiß, ist es nicht garantiert, dass das Elternteil eine bestimmte Zahl ist, deshalb habe ich geschrieben 1 or 2 or 3 or 4
(es kann jeder dieser Punkte sein). Vielleicht wird in der Dokumentation genauer erklärt, welche Nummer als Anführer der Gruppe gewählt wird (ich habe sie nicht studiert).
In meinem Fall lautet die Ausgabe:
2
2
2
2
5
6
Scheint einfach zu sein, kann aber wahrscheinlich verbessert werden, um es (irgendwie) robuster zu machen.
Anmerkung: std::iota
Füllt den Bereich [first, last) mit sequentiell ansteigenden Werten, beginnend mit value und wiederholter Auswertung von ++value. Mehr: https://en.cppreference.com/w/cpp/algorithm/iota