Optivar napisał(a)
Rozwiązałem to trochę inaczej, nie zdejmuje wierzchołka ze stosu do <ort>pÓÓÓÓki</ort> jego wszyscy potomkowie nie zostali przerobieni, co sądzicie o takim rozwiązaniu?
Yyyy, a jest inna możliwość ? "Potomkowie" rozumiem jako wszyscy sąsiedzi oprócz tego, od którego przyszliśmy.
Ja bym nie używał stosu, ze względu na to, że aby sprawdzić czy robimy cykl (bo wtedy musimy się cofnąć) trzeba przeszukać cały stos czy już wcześniej na aktualnym wierzchołku staliśmy.
Wystarczy oznaczać każdy wierzchołek podczas jego przeszukiwania. Tylko nie oznaczać bool'em (odwiedzono/nie odwiedzono) a wskaźnikiem do poprzedniego wierzchołka tak jak __krzysiek85 napisał. Wtedy nie potrzebny jest stos, i w każdym momencie można odtworzyć drogę.
W momencie, kiedy potrzebujesz drogę w odwrotnym kierunku, wystarczy odłożyć ją na tymczasowy stos (ściągając ze stosu masz odwrotną kolejność co przy wkładaniu). Jeśli często byś potrzebował odtworzyć taką odwrotną drogę to możesz zastosować dwa wskaźniki - skąd przyszedł i gdzie poszedł. Wtedy możesz poruszać się bez problemu w dwie strony. Przy 100 000 wierzchołków po 2 wskaźniki na każdy daje niecałe 800 kB, tak więc żadne obciążenie.
Algorytm dla grafu wyglądałby prawie identycznie jak w drzewie:
- Weź jakikolwiek nieoznaczony wierzchołek, oznacz go jako początkowy
- Jeśli wierzchołek posiada nieoznaczonego sąsiada - weź go, oznacz poprzednika, idź do 2
- Jeśli wierzchołek nie jest oznaczony jako początkowy - przejdź do poprzednika, idź do 2
- Jeśli graf posiada nieoznaczone wierzchołki - idź do 1 (można pominąć, jeśli graf jest spójny)
- Koniec
Ta sama różnica miedzy "weź" a "przejdź" co ostatnio. Wskaźnik NULL może oznaczać wierzchołek nieodwiedzony, umowny wskaźnik 0xFFFFFFFF może oznaczać wierzchołek początkowy, pozostałe wartości - wskaźnik do poprzednika.
Można wprowadzić optymalizacje np. pamiętać następnika, jeśli często potrzebujesz drogę wstecz.
Jeśli wierzchołki posiadają wielu sąsiadów, można pamiętać nie tyle następnika co jego pozycję w zbiorze sąsiadów.
Wtedy podczas powrotu (3.) szybciej znajdziemy następnego nieoznaczonego sąsiada, bo szukać go będziemy tylko za zapamiętaną pozycją (przed są same oznaczone).
na razie wiemy tylko, że w grafie jest 100 000 wierzchołków. Jeśli zależy ci na wydajności musisz lepiej opisać swój problem, a pomożemy :) Szczególnie interesowało by mnie jak wypada liczba sąsiadów i jak często potrzebujesz drogę wstecz.