BFS - znajdowanie drogi w grafie

BFS - znajdowanie drogi w grafie
Chev_Lucas
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 9 lat
  • Postów:50
0

Zrobiłem program, który przeszukuje graf zgodnie z algorytmem BFS. Jednak chcę bez użycia rekurencji, a jedynie kolejki lub stosu znaleźć drogę między dwoma wierzchołkami (niekoniecznie najkrótszą).
Graf mam przechowywany w postaci głównej listy z nazwami wierzchołków, która przechowuje także wskaźniki do list z wierzchołkami sąsiednimi do danego wierzchołka. Zastanawiam się, czy może lepiej byłoby użyć DFSa.

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

BFS jest lepszy do tego o czym piszesz. I nie rozumiem jaki jest problem bo napisanie BFSa bez stosu jest trywialne.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Chev_Lucas
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 9 lat
  • Postów:50
0

Właśnie piszę o BFS, którego też użyłem i który mi przechodzi przez graf, ale chcę aby znajdował mi też drogę między dwoma wierzchołkami (niekoniecznie najkrótszą).

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:6 dni
0

Chcesz powiedzieć że zrobiłeś BFS w postaci rekurencyjnej zaś w postaci iteracyjnej nie potrafisz?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Chev_Lucas
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 9 lat
  • Postów:50
0

Potrafię zrobić bez rekurencji, ale nie wiem co zrobić, jeśli chodzi o znajdowanie drogi, jak i kiedy dodawać wierzchołki, które prowadzą do docelowego wierzchołka.

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Zrób sobie klasę która przechowuje informacje o "poprzedniku" i o aktualnym polu i obekty takich klas odkładaj sobie w jakiejś kolejce. Tzn:

  • do listy wierzchołków do odwiedzenia wrzucasz sobie pierwszy wierzchołek
  • pętelka: wyciagamy z listy wierzchołków wierzchołek najwcześniej dodany (FIFO) i jeśli nie jest końcowym węzłem to dla każdego jego dziecka które nie jest odwiedzone:
    • wrzucamy do listy wierzchołków do odwiedzenia dziecko razem z informacją o jego "rodzicu" (wierzcholku z którego przyszliśmy,czyli tego którego przed chwilą wyciągaliśmy z kolejki)
  • jeśli wyciągnięty wierzchołek jest węzłem końcowym to robimy sobie odczytywanie drogi:
    • bierzemy parenta węzła końcowego, następnie jego parenta następnie jego parenta .... aż dojdziemy do wierzchołka początkowego.

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:6 dni
1

Dodam jeszcze jeden myk: - jako wierzchołek początkowy przyjmij wierzchołek który chcesz mieć na końcu drogi, wtedy ścieżka będzie prowadziła od początkowego do końcowego.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Shalom
Nie wiem czy to faktycznie jakieś wielkie usprawnienie bo to tylko kwestia czy potem odczytując trasę wrzucisz ją do LIFO czy do FIFO ;)
_13th_Dragon
Nie napisałem usprawnienie, napisałem "myk" w tym przypadku: odwrócenie kierunku ścieżki zerowym kosztem.
Chev_Lucas
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 9 lat
  • Postów:50
0

dobra, właśnie nie wiedziałem jak zrobić z tą informacją o rodzicu, dzięki - będę coś działał

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.