Minimalne drzewo rozpinające - błąd w implementacji Kruskala

0

Witam, piszę projekt, w którym mam zaimplementować algorytm Kruskala. Treść algorytmu znalazłem na wiki (http://pl.wikipedia.org/wiki/Algorytm_Kruskala) i zabrałem się za implementację. Problem pojawił się, gdy sprawdzałem to co mi algorytm zwrócił...
Oto mój kod:

void Drzewo::kruskal()
{
        //każda galąź (wierzchołek) jest na początku oddzielnym drzewem
        for (int i=0; i<this->IleWierzcholkow; i++)
                this->Wierzcholki[i].Drzewo = i;

        //zaznaczamy drogi jako nieużyte oraz inf taką,
        //że jak  na razie nie należą do mininalmego drzewa rozpinającego
        for (vector<Droga>::size_type i = 0; i < Drogi.size(); ++i)
        {
                this->Drogi[i].NalezyDoMinimalnegoDrzewa = false;
                this->Drogi[i].Uzyte = false;
        }

        Droga *akt = minimalnaDroga();

        //każdy wierzchołek na początku należy do innego drzewa
        for (int i=0; i<this->IleWierzcholkow; i++)
                this->Wierzcholki[i].Drzewo = i;


        while ((akt != 0) && (jednoDrzewo()))
        {
                akt->Uzyte = true;

                if (this->Wierzcholki[akt->X].Drzewo != this->Wierzcholki[akt->Y].Drzewo)
                {
                        akt->NalezyDoMinimalnegoDrzewa = true;
                        ustawInneDrzewo(Wierzcholki[akt->X].Drzewo, Wierzcholki[akt->Y].Drzewo);
                }

                akt = minimalnaDroga();
        }
}

//sprawdza, czy wszystkie drzewa wierzchołki należą do jednego drzewa
bool Drzewo::jednoDrzewo()
{
        int d = Wierzcholki[0].Drzewo;
        for (int i=1; i<this->IleWierzcholkow; i++)
        {
                if (Wierzcholki[0].Drzewo != d)
                        return false;
        }

        return true;
}

//najkrótsza droga w grafie, nie należąca do drzewa oraz jeszcze nie odwiedzona (użyta)
Droga * Drzewo::minimalnaDroga()
{
        Droga *minD = 0;
        int minI = INT_MAX;

        for (vector<Droga>::size_type i = 0; i < Drogi.size(); ++i)
                if ((!Drogi[i].Uzyte) && (!Drogi[i].NalezyDoMinimalnegoDrzewa))
                        if (Drogi[i].Waga<minI)
                        {
                                minI = Drogi[i].Waga;
                                minD = &Drogi[i];
                        }
        return minD;
}

Mój problem pojawia się, gdy sprawdzam to na przykładzie, gdzie graf wygląda tak: http://img130.imageshack.us/img130/2678/zrzutekranua.png
natomiast mój program zwraca taki graf (niebieskie krawędzie "należą" do minimalnego drzewa): http://img130.imageshack.us/img130/9690/zrzutekranu1ao.png
czy mógłby mi ktoś powiedzieć gdzie mam szukać błędu? Nie chcę gotowego kodu a instrukcji, gdzie szukać pomyłki.

0

Ciężko było mi coś znaleźć ale zauważ, że:
Jeżeli jest n wierzchołków to wystarczy jak dodasz n-1 krawędzi aby utworzyć drzewo.
Zaimplementuj sobie osobno Find&Union (zbiory rozłączne). Implementacja jest bardzo krótka a szybko możesz stwierdzić czy istnieje już droga miedzy podanymi wierzchołkami(sądzę, że tutaj tkwi błąd). A drogi dobrze jest przetrzymywać w priorytetowej kolejce.
Jeszcze zobaczę później na Twój kod.

0

"Wprowadzenie do algorytmów" Cormena, tam znajdziesz odpowiedzi na swoje pytania ;) Tutaj masz fragment w PDF dotyczący alg kruskala, chciałem Ci też wrzucić moją implementację w matlabie (mógłby Ci posłużyć jako pseudokod) ale gdzieś mi plik zaginął w otchłani mojego dysku :(
http://wrzucacz.pl/file/5441261233956

0

ja algorytm umie oraz rozumiem, tylko coś w kodzie mi nie wyszło ;/
dołącza o jedną drogę więcej z wierzchołka bodajże 1 do 6
ale dzięki za materiały :) na pewno się przydadzą :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1