我有点纠结于我的图表问题,而且我不是这个问题的专家,我想我会求助于互联网。我有两个图A和B,我想检查B是否是A的一个子图。我试着用iggraph来做这个,但它似乎声称B是A的一个子图,即使不是。下面是一个例子,说明了这一点:
from igraph import *
def func(g1, g2, e1, e2):
if g1.es[e1]["color"] == g2.es[e2]["color"]:
return True
else:
return False
a = Graph(4, directed=True)
a.add_edge(0,1,color=1)
a.add_edge(1,2,color=1)
a.add_edge(2,3,color=1)
a.add_edge(0,2,color=2)
a.add_edge(2,0,color=2)
a.add_edge(1,3,color=2)
a.add_edge(3,1,color=2)
b = Graph(2, directed=True)
b.add_edge(0,1,color=1)
b.add_edge(0,1,color=2)
b.add_edge(1,0,color=2)
t = a.get_subisomorphisms_vf2( other=b, edge_compat_fn=func)
print t
程序打印“[[0,2],[1,3]”
我认为B不是a的子同构,因为从顶点0开始的color=1线没有连接到顶点2,但是igraph似乎忽略了这一点。我做错什么了还是这是igraph中的一个错误?我在使用python igraph 0.6.5和python 2.6.5
编辑:我觉得这个颜色在这里可以忽略。我的问题是在图A中有一个从第0个顶点到第1个顶点的链接,所以B不是一个子图,因为这需要(在图A中)第0个顶点直接连接到第2个顶点。
我怀疑我真正想要的是“诱导子图同构”。
最佳答案
回想一下子图的定义:
一种图G',其图顶点和图边构成给定图G的图顶点和图边的子集。
这里出现的情况是,您的有向多重图没有被iggraph识别(我对iggraph的了解还不足以知道是否支持有向多重图)。图B上(0,1,color=2)的第二条边似乎只是(0,1,color=1)的重新分配颜色。
如果这是真的,那么输出t完全有意义。那确实是两个子图同构。同构在这里不尊重边缘着色,除非你这样做明确。如果需要,在调用get_subisomorphs_vf2时,必须更新代码以添加edge_color1和edge_color2。
你有什么要求?你想解决什么问题?