Для базовой идеи алгоритма Беллмана-Форда, вот небольшой обзор из Википедии :
Алгоритм Беллмана-Форда просто ослабляет все ребра и делает это |V|-1
раз, где |V|
- количество вершин в графе.
Тогда объяснение для вашей строки if ind==len(adj) - 1
будет
Поскольку самый длинный путь возможенбез цикла могут быть |V|-1
ребра, ребра должны быть отсканированы |V|-1
раз, чтобы убедиться, что для всех узлов найден кратчайший путь.
Выполняется окончательное сканирование всех ребер и, если есть расстояниеобновляется, то был найден путь длиной |V|
ребер, который может возникнуть, только если в графе существует хотя бы один отрицательный цикл.
Беллман-Форд предполагает, что сначала расстояния очень велики (бесконечность), а затем постепенно уменьшают их до минимально возможных.Это называется релаксация .В каждой итерации ребра на один шаг дальше от источника расслабляются.
S --> A --> B --> C --> D --> E --> F --> G --> H --> I
Теперь предположим, что у вас есть график без отрицательных циклов.Скажем, у него есть 10 вершин, вам нужно не более 9 релаксаций, чтобы достичь (получить кратчайший путь) самой дальней вершины из источника.Что если после 9 расслаблений у вас все еще есть улучшения?На вашем графике должны быть отрицательные циклы.
ind
в вашем коде является счетчиком.Когда ind == len(adj) - 1
, это означает, что вы уменьшили расстояния в |V|
раз, что говорит о существовании отрицательного (ых) цикла (ов).
Также обратите внимание на третью страницу из последней в своей заметке.