ベルマン - フォード法(ベルマン - フォード・アルゴリズム)

定義

ベルマン - リチャードバーマン(リチャードベルマン)とレスターフォードフォードアルゴリズム、単一始点最短経路問題を解くためのアルゴリズムは、設立しました。

これは、すべての可能な最短経路を与えるために、図緩和の動作原理です。ダイクストラ法よりもその優れたは欠点は、時間の複雑さが高すぎるで、辺の重みが負になることができます簡単です。

原則

緩和(DISTなら[V] <DIST [U] + W、DIST [V] = DIST [U] + w)は、最短距離を更新する既存のエッジの繰り返し使用によってベルマン - フォード法。

負のサイクルが存在しないことは、後に終了する場合は(N-1)緩和時間。ほとんどの(N-2)ドットの後に任意の2点間の最短経路は、後に(N-1)回の最短経路を操作した後に得ることができるからです。

負のサイクルが存在する場合には、n番目の緩和操作はまだ成功します、ベルマン - フォード法は、ジャッジメントリングの負の本質を使用することです。

実現

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
const  int型 INF = 0x3f3f3f3f const  int型 MAXN = 10005 ;
構造体ノード
{ 
  int型U、V、W。
}エッジ[MAXN]。
INT DIS [MAXN]、N、Mを。
int型 Bellman_Ford(int型秒)。
INT のmain()
{ 
  int型私は、   
  scanf関数(" %d個の%のD "、&​​N、&M)。
  (i = 1 ; I <= M; iは++)のscanf(" %D%D%D "、およびエッジ[I] .U、&エッジ[I] .V、&エッジ[I] .W)。
  もし(Bellman_Ford(1))のprintf(" 有负环\ n " ); 
  システム(一時停止)。
  リターン 0 ; 
} 
INT Bellman_Ford(int型の)
{ 
  int型のチェックフラグ= 0 、I、J。
  フィル(DIS、DIS + MAXN、INF)。DIS [S] = 0 ;
  (J = 1 ; J <= N- 1、J ++ 
  { 
    チェック = 0 (i = 1 ; I <= M; iは++ もし(DIS [エッジ[i]は.V]> DIS [エッジ[I] .U] + エッジ[I] .W)
      { 
        DIS [エッジ[I] .V] = DIS [エッジ[I] .U] + エッジ[I] .W。
        チェック = 1 ; 
      } 
    場合(チェック!)休憩を
  } 

  のための(i = 1 ; I <= M; iは++ 場合(DIS [エッジ[I] .V]> DIS [エッジ[I] .U] + エッジ[I] .W)
      { 
        フラグ = 1 破ります; 
      } 

  であれば(フラグ)リターン 1 
    のための(I = 1 ;私は<= N; I ++
      のprintf(" %dの- >%D%D \ n " 、S、I、DIS [I])。
  リターン 0 ; 
}

おすすめ

転載: www.cnblogs.com/VividBinGo/p/11615725.html