隣接行列で経路数を求める方法(Python版)

プログラミング

隣接行列について

過去に隣接行列についてまとめたブログがあるので、隣接行列についてはこちらをご覧ください。

↓を参照しておきます。


隣接行列の積をPythonで表現する方法

今回も、この無向グラフを用いて考えていきます。

図1)無向グラフ

そのため、隣接行列は↓のようになりますね。


経路数を求めるには、隣接行列の積を求める必要があります。

隣接行列は必ず正方行列となるため、正方行列の積を求める関数「multiply」を作成します。

また、行列計算で用いられる方法である。二重リストを用いて隣接行列Aを表現します。

これらをPythonで表現すると↓のようになります。

N=4#節点数(節点0,1,2,3の4つ)
def multiply(c,a,b):#N次正方行列の積を求める関数
    for i in range(N):
        for j in range(N):
            s=0
            for k in range(N):
                s+=a[i][k]*b[k][j]
            c[i][j]=s

#長さ2の経路数を表す行列Cを作成
C=[[0 for j in range(N)] for i in range(N)]

#隣接行列Aを2重リストを用いて表現
A = [[0,1,1,0],
     [1,0,0,1],
     [1,0,0,1],
     [0,1,1,0]] # 隣接行列 A
multiply(C,A,A) # 行列Cを計算(C=A*A)

#行列Cを表示
for i in range(N):
    for j in range(N):
        if j == N-1: print(" ",C[i][j])
        else: print(" ",C[i][j],end="")

これを実行すると、

手計算した場合と比較しても、上手くいっていることがわかります。

正常に「長さ2」の経路数が求められています。


「長さ3」の経路数をPythonで求める方法

「長さ3」の経路数を表す行列Fを、隣接行列を用いて手計算で求める場合、

となります。

これを先ほどのPythonプログラムコードを用いて、表現したいと思います。

N次正方行列の積を求めてくれる 関数「multiply」 を使えば、

行列Fも簡単に求められます。

N=4#節点数(節点0,1,2,3の4つ)
def multiply(c,a,b):#N次正方行列の積を求める関数
    for i in range(N):
        for j in range(N):
            s=0
            for k in range(N):
                s+=a[i][k]*b[k][j]
            c[i][j]=s

#長さ2の経路数を表す行列Cを作成
C=[[0 for j in range(N)] for i in range(N)]
#長さ3の経路数を表す行列fを作成
F=[[0 for l in range(N)] for i in range(N)]

#隣接行列Aを2重リストを用いて表現
A = [[0,1,1,0],
     [1,0,0,1],
     [1,0,0,1],
     [0,1,1,0]] # 隣接行列 A
multiply(C,A,A) # 行列Cを計算(C=A*A)
multiply(F,C,A) # 行列Fを計算(F=C*A)
#行列Fを表示
for i in range(N):
    for j in range(N):
        if j == N-1: print(" ",F[i][j])
        else: print(" ",F[i][j],end="")

青字の所が、先ほどのプログラムコードからの変更点です。

行列Fを求めるコードを追加し、表示する2重リストをFに変更しただけですね。

長さ3以降の経路数を表す行列も、同じように求めていくことができます。

コメント

タイトルとURLをコピーしました