포드-벨만 알고리즘


포드-벨만 알고리즘
n 꼭지점과 m 가장자리, 일부 시작 꼭지점 vG가 주어집니다. > . 정점 v에서 다른 모든 정점까지의 최단 경로 길이를 찾는 데 필요합니다.

Dijkstra와 마찬가지로 Ford-Bellman은 꼭지점 1에서 다른 모든 정점까지의 거리를 찾지만 음의 가장자리로 작동.
<사업부> 
Ford-Bellman 알고리즘 자체는 여러 단계(n-1)로 구성됩니다. 각 단계에서 그래프의 모든 가장자리가 검사되고 알고리즘은 비용 c의 각 가장자리 (a, b)를 따라 완화하려고 시도합니다. 가장자리를 따라 이완 — 이것은 d[a] 의 의미를 개선하려는 시도입니다. 값 d[b] + c. 사실 이것은 우리가 edge  상단에 대한 현재 답변입니다.

d 배열은 Dijkstra와 마찬가지로 시작 정점에서 가장 짧은 길이의 배열입니다. 처음에는 시작 정점을 제외하고 가능한 한 큰 숫자로 채웁니다. 0.
에지를 저장하기 위해 인접 행렬이나 가중치 행렬이 아니라 에지가 어느 노드에서 출발하는지(from), 어느 노드로 오는지(to) 및 무게(비용).
  구조체 가장자리 { int from, to, 비용; }; 벡터<에지> 가장자리;
INF 상수는 숫자 "무한대"를 나타냅니다. - 가능한 모든 경로 길이를 분명히 초과하는 방식으로 선택해야 합니다.
<사업부>
알고리즘의 가장 간단한 구현: d[v] = 0; for (int i=0; i

또는 C++11:
구문을 사용하여 조금 더 짧게   d[v] = 0; for (int i=0; i< n-1; ++i) for (에지 j: 에지) if (d[j.from] <INF) d[j.to] = min(d[j.to], d[j.from] + j.cost);

작업 예시


간단한 방향성 그래프를 가져옵니다.  5개의 노드, 가중치가 1인 4개의 에지.

그 순서대로 에지 목록을 소개하겠습니다.
4 5 1
3 4 1
2 3 1
1 2 1


최단 길이 배열의 초기 값:
  <몸>
여기서 inf는 항상 가장자리의 가중치보다 큰 일치하는 정수여야 합니다.

1차 합격 후
 
0 정보 정보 정보 정보
<몸>
2차 합격 후
 
0 1 정보 정보 정보
<몸>
3차 합격 후
 
0 1 2 정보 정보
<몸>

4차 통과 후
 
0 1 2 3 정보
<몸>
1에서 마지막 순서로 가장자리를 공급하면 첫 번째 통과 후 가장 짧은 길이를 찾을 수 있습니다.

 

0 1 2 3 4