floydとshallアルゴリズム


フロイドとシャールアルゴリズムとは何ですか?

  • マルチアウトアルゴリズムは、1つの定義された頂点から、他のすべての頂点の最短経路を求めるアルゴリズムである.
  • のすべての頂点からすべての頂点への最短経路を求めたいなら、ヨアロクリ主義.
  • 差異
  • マルチ出口アルゴリズムは、最も少ないターゲット
  • を選択する.
  • を通過する頂点に基づいて最短距離
  • を求める.

  • 上の図では、各頂点から別の頂点へのコストが2 D配列で表示されます.
    1
    2
    3
    4
    1
    0
    5

    8
    2
    7
    0
    9

    3
    2

    0
    4
    4


    3
    0

  • 頂点1を通過
    1
    2
    3
    4
    1
    0
    5

    8
    2
    7
    0
    更新
    更新
    3
    2
    更新
    0
    更新
    4

    更新
    更新
    0

  • 更新1を含まない部分と自分を含まない部分
  • (2~1):7 + (1~3):∞ < (2~3):9 => (2~3):9
  • (2~1):7 + (1~4):8 < (2~4):∞ => (2~4):15
  • (3~1):2 + (1~2):5 < (3~2):∞ => (3~2):7
  • (3~1):2 + (1~4):8 < (3~4):4 => (3~4):4
  • (4~1):∞ + (1~2):5 < (4~2):∞ => (4~2):∞
  • (4~1):∞ + (1~3):∞ < (4~3):3 => (4~3):3

  • これを2次元配列に置き換えると
    1
    2
    3
    4
    1
    0
    5

    8
    2
    7
    0
    9
    15
    3
    2
    7
    0
    4
    4


    3
    0

  • 頂点2を通過
  • 更新前
    1
    2
    3
    4
    1
    0
    5
    更新
    更新
    2
    7
    0
    9
    15
    3
    更新
    7
    0
    更新
    4
    更新

    更新
    0
  • 更新後
    1
    2
    3
    4
    1
    0
    5
    14
    8
    2
    7
    0
    9
    15
    3
    2
    7
    0
    4
    4


    3
    0

  • 頂点3を通過
  • 更新前
    1
    2
    3
    4
    1
    0
    更新
    14
    更新
    2
    更新
    0
    9
    更新
    3
    2
    7
    0
    4
    4
    更新
    更新
    3
    0
  • 更新後
    1
    2
    3
    4
    1
    0
    5
    14
    8
    2
    7
    0
    9
    13
    3
    2
    7
    0
    4
    4
    5
    10
    3
    0

  • 頂点4を通過
  • 更新前
    1
    2
    3
    4
    1
    0
    更新
    更新
    8
    2
    更新
    0
    更新
    13
    3
    更新
    更新
    0
    4
    4
    5
    10
    3
    0
  • 更新後
    1
    2
    3
    4
    1
    0
    5
    11
    8
    2
    7
    0
    9
    13
    3
    2
    7
    0
    4
    4
    5
    10
    3
    0

  • 初期2 Dアレイ
    1
    2
    3
    4
    1
    0
    5

    8
    2
    7
    0
    9

    3
    2

    0
    4
    4


    3
    0

  • 最終アレイのステータス
    1
    2
    3
    4
    1
    0
    5
    11
    8
    2
    7
    0
    9
    13
    3
    2
    7
    0
    4
    4
    5
    10
    3
    0

  • ソースコード
  • let number = 4;
    
    // 자료 배열 초기화
    let a = [
      [0,5,Infinity,8],
      [7,0,9,Infinity],
      [2,Infinity,0,4],
      [Infinity,Infinity,3,0]
    ];
    
    let floydWarshall = () => {
      // 결과 그래프 초기화
      let b = a.slice();
      
      // 거쳐가는 Vertex
      for(let k=0; k<number; k++) {
        // 출발 vertex
      	for(let i=0; i<number; i++) {
            // 거쳐가는 v와 출발하는 v 같으면 다음 인덱스로
          if(k === i) continue;
            // 도착 vertex
        	for(let j=0; j<number; j++ ) {
              // 거쳐가는 v와 도착하는 v 같은 경우나
              // 출발v와 도착v과 같은 경우 다음 인덱스
              if(k === j || i === j) continue;
              if(b[i][j] > b[i][k] + b[k][j]) {
                b[i][j] = b[i][k] + b[k][j];
              }
            }
     
        }
      }
      console.table(b);
    }
    

    ソース


    [動賓座のfloydとshallアルゴリズム](blogyoutube)

    Tip


    htmlタグに無限タグを付ける
  • &#8734; &#x221e; &infin; 236
  • 上付き文字
  • <sup><sub>
  • ポスト


    このアルゴリズムを習い始めたばかりの頃、これは何なのか頭の中で考えていました.
    描けないので、動画やノートに何度も何度も何度も繰り返し描いて、やっと理解できました.難しいけど面白い!