0Pricing
Competitive Programming Academy · Lekcja

Bellman-Ford i ujemne krawędzie

Obsługa wartości ujemnych i wykrywanie cykli

Bellman-Ford i ujemne krawędzie to bezpłatna lekcja Competitive Programming Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Competitive Programming Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Competitive Programming Academy zawiera 4 lekcji w sumie.

Kiedy Dijkstra zawodzi

Dijkstra zakłada, że pobrana odległość jest ostateczna, ale ujemna krawędź może później obniżyć koszt ścieżki. Dlatego algorytm zawodzi.

Poznaj algorytm Bellmana-Forda

Bellman-Ford obsługuje ujemne wagi krawędzi. Jest wolniejszy od algorytmu Dijkstry, ale sprawdza się tam, gdzie nie można ufać logice zachłannej.

Najważniejsza operacja

Algorytm wielokrotnie wykonuje relaksację każdej krawędzi: jeśli dist[u] plus waga krawędzi daje wartość mniejszą niż dist[v], aktualizuje dist[v] tą mniejszą wartością.

if dist[u] + w < dist[v]:
    dist[v] = dist[u] + w

Ile rund

Najkrótsza ścieżka używa najwyżej V minus 1 krawędzi, więc V-1 rund relaksacji wszystkich krawędzi wystarcza do ustalenia wszystkich odległości.

for _ in range(n - 1):
    relax_all_edges()

Inicjalizacja odległości

Na początku każdą odległość należy ustawić na nieskończoność, z wyjątkiem źródła, dla którego należy ustawić zero, dokładnie tak jak w algorytmie Dijkstry.

dist = [float('inf')] * n
dist[src] = 0

Jedno pełne przejście

W każdym przejściu przechodzi się raz przez całą listę krawędzi i wykonuje relaksację każdej z nich. Ulepszenia rozchodzą się na zewnątrz o jeden krok w każdym przejściu.

for u, v, w in edges:
    if dist[u] + w < dist[v]:
        dist[v] = dist[u] + w

Dlaczego wystarcza V-1

Po k przejściach poprawne są wszystkie najkrótsze ścieżki używające k krawędzi. Po V-1 przejściach zakończona jest każda najkrótsza ścieżka prosta.

Dodatkowe przejście

Należy wykonać jeszcze jedno przejście. Jeśli dowolna odległość nadal się zmniejsza, oznacza to, że można ją wciąż obniżać, co sygnalizuje ujemny cykl.

Wykrywanie ujemnych cykli

Ujemny cykl oznacza, że nie istnieje skończona najkrótsza ścieżka, ponieważ można wykonywać go w nieskończoność i bez ograniczeń obniżać koszt.

for u, v, w in edges:
    if dist[u] + w < dist[v]:
        return 'negative cycle'

Czas działania

Relaksuje się E krawędzi w ciągu V przejść, więc algorytm Bellmana-Forda działa w czasie O(V * E), co wystarcza dla małych i średnich grafów.

Dijkstra czy Bellman-Ford

Algorytm Dijkstra należy wybrać dla nieujemnych wag i wysokiej wydajności. Algorytm Bellmana-Forda należy wybrać, gdy występują wartości ujemne lub trzeba wykryć niepoprawny cykl.

Krótki test

Po V-1 przejściach odległość nadal zmniejsza się podczas kolejnego przejścia. Co to oznacza?

Podsumowanie: Bellman-Ford

Należy relaksować wszystkie krawędzie przez V-1 przejść, a następnie wykonać jeszcze jedno, aby wykryć ujemne cykle. Algorytm działa w czasie O(V*E), ale sprawdza się tam, gdzie Dijkstra nie może być użyty. ✅

Często zadawane pytania

Czy lekcja „Bellman-Ford i ujemne krawędzie” jest bezpłatna?

Tak — pełny tekst „Bellman-Ford i ujemne krawędzie” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Competitive Programming Academy, przejdź na CoddyKit PRO. Kurs Competitive Programming Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Bellman-Ford i ujemne krawędzie”?

Obsługa wartości ujemnych i wykrywanie cykli Ćwiczysz Competitive Programming Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Competitive Programming Academy?

Nie wymagamy żadnego doświadczenia. Competitive Programming Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Bellman-Ford i ujemne krawędzie”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Competitive Programming Academy?

Tak. Każda lekcja Competitive Programming Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Algorytm Dijkstry ze stosem kopcowym
  2. 0-1 BFS z deque
  3. Bellman-Ford i ujemne krawędzie
  4. Floyd-Warshall dla wszystkich par
← Powrót do Competitive Programming Academy