Zasada działania tego algorytmu jest prosta. Na początku ustawiamy sobie wyniki do każdego punktu jako nieskończoność.
Z obranego punktu startowego wyszukujemy wychodzące krawędzie i zapisujemy ich wagi jako wyniki do poszczególnych wierzchołków, do których wchodzą krawędzie z punktu startowego.

Potem dla każdego z tych wierzchołków rozpatrzmy wychodzące krawędzie na podobnej zasadzie co wcześniej, z tym, że nie zapisujemy wag jako wyniki, tylko sprawdzamy czy suma wagi danej krawędzi i wyniku do wierzchołka wychodzącego jest mniejsza niż wynik dla wierzchołka, do którego krawędź wchodzi. Jeśli tak to nadpisujemy wynik.
Czynność tę powtarzamy tak długo, że nie będziemy mogli już dokonać żadnej zmiany.

To tyle teorii… Może trochę pogmatwałem, ale mam nadzieję, że zrozumiecie 😉

Teraz kod implementacyjny:

Kod stary:

kod nowy:

uwaga:
Stała MAX określa maksymalną ilość wierzchołków, jakie może zawierać graf 😉

I to właściwie na tyle… Starałem się zrobić, aby działał on jak najszybciej, choć nie wiem czy mi się to udało. Jeśli ktoś znalazłby błąd lub miałby jakieś sugestie to bardzo proszę o poprawienie ;p Kod pisałem sam, nie korzystając z żadnych pomocy lub innych algorytmów, więc nie jest to wzorcówka 😉

//edit: dodałem wcięcia ;p
//edit2: dodałem drugą wersję, która powinna działać odrobinę szybciej 😉

//przepraszam, że się wcinam w artykuł, ale chciałbym kod wkleić

Program generujący przypadek, dla którego algorytm działa w czasie O(n^3).

Zmiany w kodzie pierwszego programu pozwalające na zliczenie przebiegów pętli, rozważanych wierzchołków oraz rozważanych krawędzi.
Można udowodnić, że przebiegów pętli (w grafie generowanym przez podany generator) jest n, rozważeń wierzchołków n(n-1)/2, zaś rozważonych krawędzi (n-2)(n-1)n/6, a to ostatnie jest O(n^3).

Autor: Lewymati