Szybkie badanie spójności grafu.

0

Mam problem z wymyśleniem fajnego (== szybkiego) algorytmu badającego spójność w grafie.
Ale nie chodzi tu o to, żeby po prostu dla danego grafu sprawdzić, czy jest spójny...

Mam jakiś algorytm, który z jednego grafu ma utworzyć inny, nieważne w jaki sposób. Algorytm, który tworzy graf, mam już wymyślony i jest ok. Ale muszę go przerwać, gdy utworzony graf będzie spójny (ale nie musi być drzewem - mogą być cykle, krawędzie wielokrotne itd., w sumie nieważne). Potrzebuję więc jakiegoś sposobu na sprawdzenie, czy powstały graf jest już spójny - ale muszę to sprawdzać po dodaniu każdej kolejnej krawędzi do niego. Dane wejściowe to lista krawędzi.

Pewnie dobrym pomysłem jest utworzenie macierzy sąsiedztwa (czy raczej nie sąsiedztwa, ale "istnienia ścieżek" między wierzchołkami) i sprawdzanie, czy z któregośtam wierzchołka da się jakoś dojść do wszystkich innych. Ale takie rozwiązanie niestety nie jest możliwe przez ograniczenia pamięciowe.
Jedyne, co do tej pory wymyśliłam, to utworzenie grup wierzchołków (w sensie - spójnych składowych). Tzn. mam jakąś tablicę g[n] z numerami grup, tzn. g[i] to numer grupy, do której należy i-ty wierzchołek. I gdy dodaję krawędź (v1, v2) do grafu, to wszystkim wierzchołkom z numerem grupy g[v1] zmieniam ten numer na g[v2], tzn. łączę te grupy. Następnie sprawdzam, czy już wszystkie wierzchołki mają taki sam numer grupy. To oczywiście działające, ale bardzo słabe rozwiązanie, przede wszystkim zbyt wolne...

Ma ktoś może pomysł na zrobienie tego jakoś sprytniej?
Z góry dziękuję za pomoc. :)

2

A nie da rady zwyczajnym algorytmem zbiorów rozłącznych? W chwili kiedy pozostał ci jeden zbiór to kończysz i tyle.
http://pl.wikipedia.org/wiki/Struktura_zbiorów_rozłącznych

0

Oczywiście nie było żadnego problemu z pamięcią. ;) To tylko ja jestem głupia i nie zrozumiałam do końca na czym polegają algorytmy działające na tej strukturze Union-Find. :P
Ale już rozumiem. W limicie pamięciowym się oczywiście zmieściłam. W czasowym dało radę w 4 testach (na 5), ale spróbuję to jeszcze jakoś usprawnić.

Dziękuję za pomoc. :)

Edit: już przechodzi 5 testów. ;)

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