ワーシャルフロイド法

最短経路繋がりで、ワーシャルフロイド法を用いて全ての2点間の最短距離を求めてみた。入力データは前回用いたものと同じ(隣接行列表現)なので、結果の二次元配列の最初の要素はダイクストラ法で求めたものと同じ出力結果になっている。

#light "off"

//ワーシャルフロイド法
let m = int.MaxValue;;
let nodenum = 6;;
//隣接行列
let adj = [| [|0;5;4;2;m;m;|];
             [|5;0;2;m;6;m;|];
             [|4;2;0;3;m;2;|];
             [|2;m;3;0;m;6;|];
             [|m;6;m;m;0;4;|];
             [|m;m;2;6;4;0;|]; |];;
//結果が入るデータ
let cost = Array.copy adj;;
//メインの処理
for k=0 to nodenum-1 do
    for i=0 to nodenum-1 do
        for j=0 to nodenum-1 do
            //オーバーフロー対策
            if cost.[i].[k] = int.MaxValue || cost.[k].[j] = int.MaxValue then ()
            else
            cost.[i].[j] <- min (cost.[i].[j]) (cost.[i].[k]+cost.[k].[j])
        done
    done
done;
print_any cost;;