カメヲラボ

主にプログラミングとお勉強全般について書いてます

第03回 隣接行列のイ・イ・ト・コ・ロ

今回は隣接行列に絞って書く。というのも、この隣接行列というのは色々とアレンジしやすい。

補グラフ

例えば下のようなグラフ。

グラフGの、つながっていない点同士を結んで、つながっている部分は削除すると、補グラフ\bar{G}が出来る。

ちなみに、この例のグラフは同型(頂点の次数がGと\bar{G}で等しい*1)なので、自己補グラフという特別な名前がついている。


さらには、これらのグラフを重ね合わせるとすべての点同士が結ばれている。このように、単純グラフ(多重辺やループが無いグラフ)で、すべての点が結ばれているグラフを完全グラフという。


Gと\bar{G}を行列で表してみると
\large{G= }\large\left(\begin{array}&v1&v2&v3&v4&v5\\\hdash v1&0&1&0&0&0\\v2&1&0&1&0&1\\v3&0&1&0&1&1\\v4&0&0&1&0&0\\v5&0&1&1&0&0\\\end{array}\right)     \large\bar{G} = \large\left(\begin{array}&v1&v2&v3&v4&v5\\\hdash v1&0&0&1&1&1\\v2&0&0&0&1&0\\v3&1&0&0&0&0\\v4&1&1&0&0&1\\v5&1&0&0&1&0\\\end{array}\right)
このようになる。ループが無いので対角成分は同じとして、それ以外は0と1が反転しているだけだ。ということは、行列Gを用意しておけばGの補グラフは容易に生成できることがわかる。

重み付グラフ

各辺に重みのついたグラフ。辺に長さがあると考えても良い。このようなグラフを考えるとき、これまで"1"としていた部分に重みの値をそのまま入れることで容易に重み付グラフのデータを表現することが出来る。たとえば以下のようなグラフ

これを行列で表現してみると
\large\left(\begin{array}&v1&v2&v3&v4&v5\\\hdash v1&0&1.2&0&0&0\\v2&1.2&0&1&0&2\\v3&0&1&0&1&1.8\\v4&0&0&1&0&0\\v5&0&2&1.8&0&0\\\end{array}\right)
のようになる。

有向グラフ

文字通り、向きのあるグラフ。辺を道と考えると、一方通行があるグラフということだ。

このように、辺の部分を矢印で書いたグラフを行列で表してみると、
\large\left(\begin{array}&v1&v2&v3&v4&v5\\\hdash v1&0&0&0&0&0\\v2&1&0&1&0&0\\v3&0&1&0&0&1\\v4&0&0&1&0&0\\v5&0&1&0&0&0\\\end{array}\right)
となり、対角行列に対して対称ではなくなる。
もし、「一方通行」と「もともとつながっていない」ということを区別したければ
\large\left(\begin{array}&v1&v2&v3&v4&v5\\\hdash v1&0&-1&0&0&0\\v2&1&0&1&0&-1\\v3&0&1&0&-1&1\\v4&0&0&1&0&0\\v5&0&1&-1&0&0\\\end{array}\right)
というように、0以外の値にするのも良いだろう。


また、グラフ理論の応用としてよく例に出されるGooglePageRankシステムでは、各列の合計値が1になる推移確率行列と呼ばれるものを使用している。この辺はSofware Design10月号のひなた先生(id:yaneurao)で簡単に説明されているので、読んでおくと参考になる。でももうすぐ11月号が出るから、はよ買わんと売り切れるでー(´ー`)


つづく

*1:このあたりの内容は、グラフ理論の本をまじめに読んだほうが良い