Stan, który sugerujesz, gdy krawędź jest krytyczna, jest prawidłowy, tak myślę.Ale nie jest konieczne, aby znaleźć cykl i przetestować każdy jego brzeg.
Algorytm Kruskala dodaje krawędzie w rosnącej kolejności, więc kolejność dodawania krawędzi może zostać podzielona na bloki o równych krawędziach. Wewnątrz każdego bloku o równej wadze, jeśli istnieje więcej niż jedna krawędź łącząca te same dwa składniki, wszystkie te krawędzie są niekrytyczne, ponieważ zamiast tego można wybrać dowolną z pozostałych krawędzi. (Mówię, że nie są one krytyczne, ponieważ w rzeczywistości nie otrzymujemy konkretnego MST jako części danych wejściowych - gdybyśmy wtedy byli, to określilibyśmy konkretną krawędź, by wywołać niekrytyczne krawędź, którą faktycznie wybiera Kruskal, tylko artefakt początkowego porządkowania krawędzi lub sposobu zaimplementowania sortowania.)
Ale to nie jest wystarczające: może być tak, że po dodaniu wszystkich krawędzi wagi 4 lub mniejszej do MST, okazuje się, że istnieją 3 5 krawędzi, łączących pary elementów (1, 2), (2, 3) i (1, 3). Chociaż żadna para komponentów nie jest połączona przez więcej niż 1 z tych 3 krawędzi, potrzebujemy tylko (dowolnych) 2 z nich - użycie wszystkich 3 spowoduje utworzenie cyklu.
Dla każdego bloku o jednakowej wadze, mając wagę np. W, musimy faktycznie (teoretycznie) utworzyć nowy wykres, w którym każdy składnik MST do tej pory (tj. Przy użyciu krawędzi o wadze < w) jest wierzchołku, a między dwoma wierzchołkami znajduje się krawędź, gdy między tymi komponentami znajduje się granica waga. (Może to skutkować wieloma krawędziami.) Następnie uruchomimy DFS na każdym komponencie tego wykresu, aby znaleźć dowolne cykle i oznaczyć wszystkie krawędzie należące do takiego cyklu jako niekrytyczne. DFS pobiera czas O (nEdges), więc suma czasów DFS dla każdego bloku (którego rozmiary sumują się do E) będzie wynosić O (E).
Zauważ, że algorytm Kruskala wymaga czasu O (Elog E), a nie O (E), jak sugerujesz - chociaż ludzie tacy jak Bernard Chazelle zbliżają się do linearnej konstrukcji MST, TTBOMK, której jeszcze nikt nie ma ! :)
Nie zrozumiałem dlaczego suma czasów dfs będzie O (E). Rozważ ten wykres http://i.imgbox.com/RdXix9x4.png Czy to w porządku, że dfs będzie przemierzać odpowiednio 3, 5, 7, 9, 11 wierzchołków co 3 stopień algorytmu Kruskala? Prowadzi to do co najmniej O (V^2) dodatkowego czasu na rozrzedzone wykresy (nie jestem pewien, jak wygenerować wykres E << V^2 dla przypadku O (EV), ale jest to możliwe, myślę). Na gęstych wykresach, dfs będzie nazywane O (E - (V-1)) ~ O (V^2) razy, a jego koszt będzie wynosił O (V), więc całkowita dodatkowa złożoność będzie równa O (V^3) który wcale nie jest O (ElogE). Mb Myli się gdzieś? – Ralor
Oto zły test dla gęstych wykresów http://i.imgbox.com/hbWvMRmg.png Przepraszamy za nekropostację, chociaż)) Obecnie szukam rozwiązania ElogV (w rzeczywistości jest to zadawane w książce Sedgewick) – Ralor
@Ralor : Moje roszczenie O (E) za sumę czasów DFS jest nieco błędne, ponieważ potrzebujesz również czasu na utrzymanie "wykresu komponentu" (wykresu, w którym każdy wierzchołek jest składnikiem dotychczasowego MST, i każdej krawędzi jest ujemny na oryginalnym wykresie), co zajmuje co najmniej czas odwrotny do Ackermanna na operację. (Przetwarzanie każdego bloku krawędzi o jednakowej wadze na oryginalnym wykresie powoduje, że niektóre podzbiory wierzchołków są łączone na wykresie komponentów i świeży podzbiór krawędzi do wyodrębnienia.) Następnie zauważ, że każda krawędź na oryginalnym wykresie będzie odwiedzane przez DFS dokładnie jeden raz. –