SageMathとグラフ理論(カノニカル行列)

Pythonのdictionaryの形で次のように指定すると、グラフが描けます。

 

g1=Graph({'P':['Q','S','T'],'Q':['R','S','T'],'R':['S'],'S':['T']})
show(g1)

f:id:niming538:20170923190550p:plain

 

これはうまい具合に横向きになったし、なによりも頂点がアルファベット順ですがいつも必ずしもそうではありません。


ただし、隣接行列の形は常に一緒です。

 

g1.adjacency_matrix()
[0 1 0 1 1]
[1 0 1 1 1]
[0 1 0 1 0]
[1 1 1 0 1]
[1 1 0 1 0]

 

たぶん人間には一番わかり易い頂点のリストと辺のリストを組み合わせた指定の仕方をしてみます。

 

V=['P','Q','R','S','T']
E=[['P','Q'],['Q','R'],['R','S'],['S','T'],['T','P'],['P','S'],['Q','T'],['Q','S']]
g2=Graph([V,E])
show(g2)

f:id:niming538:20170923190654p:plain


g2.adjacency_matrix()
[0 1 0 1 1]
[1 0 1 1 1]
[0 1 0 1 0]
[1 1 1 0 1]
[1 1 0 1 0]

 

行列の形が同じになりましたが、これは偶然かもしれない。


カノニカルラベルに振りなおしてみます。


(g1.canonical_label()).adjacency_matrix()
[0 0 0 1 1]
[0 0 1 1 1]
[0 1 0 1 1]
[1 1 1 0 1]
[1 1 1 1 0]


今度は行列の形は違いますが、同じもののはずです。


g3=Graph( (g1.canonical_label()).adjacency_matrix())
show(g3)

f:id:niming538:20170923190758p:plain

g1.is_isomorphic(g3)
True
g2.is_isomorphic(g3)
True

 

ほらね。