Ciao!!
E' da un po' di giorni che ho un problema con l'algoritmo Union - Find, non saprei proprio cosa fare. Ce n'è voluto molto per capire esattamente come funziona (con i due ordinamenti Quick - Union e Quick - Find..), ma ora ad implementarlo è tutta un'altra storia..
Le slide dicono questo :
Tipo di dato : Union Find
Collezione di insiemi disgiunti identificati mediante una etichetta
Operazioni : Makeset( Elemento a )
Crea un insieme formato da un solo elemento, 'a', ed associa all’insieme
l’etichetta 'a'
Union( Insieme A, Insieme B )
Unisce gli elementi degli insiemi A e B in un unico insieme che etichetta
con 'A'. I vecchi insiemi A ed B saranno cancellati
Find( Elemento a )
Restituisce l’etichetta dell’insieme contenente l’elemento a.
Io sono riuscito purtroppo a fare solo questo in codice, per ora :
codice:
#include <iostream>
#include <stdlib.h>
using namespace std;
class Union {
private :
struct Nodo {
char name;
char elem;
};
Nodo* A;
//Nodo* B; // Ho bisogno di dichiarare anche un altro nodo, 'B', che è il fratello di 'A'??
public :
Union() { A = NULL; }
~Union() { delete A; }
void makeSet(Nodo*, char, char);
char unione(Nodo*, Nodo*);
char find(Nodo*);
void print(Nodo*);
};
void Union::makeSet(Nodo* A, char n, char e) {
cout << "Inserisci il nome del nuovo insieme : ";
cin >> n;
cout << "Inserisci l'elemento (carattere) : ";
cin >> e;
A = new Nodo();
A->name = n;
A->elem = e;
}
char Union::unione(Nodo* A) {
// Non lo so!
void Union::find(Nodo* etichetta) {
// Nemmeno :confused:
Ciò che ho bisogno di fare l'ho disegnato nel file in allegato (spero si capisca, anche perché è banale).
Sarei molto grato a chiunque mi darà anche un piccolo suggerimento su come andare avanti nelle funzioni 'unione()' e 'find()', e mi piacerebbe sapere da qualcuno esperto come voi se la classe è corretta, o meglio, ho bisogno di un solo puntatore alla struttura, o due? O sarebbe meglio non utilizzare proprio la struttura, ma semplicemente un campo per il nome del nodo ed uno per l'elemento??