加权子图同构

时间:2013-12-05 23:28:43

标签: algorithm graph subgraph isomorphism

我一直在网上搜索这个连续两三天,但到目前为止没有运气。

我知道野外子图同构有很多库和实现,但它们都适用于未加权的图。例如,两种最流行的算法是VF2和Uleman算法。在这里,我的问题是:有没有给出图(G)和查询图(g)的方法,可以找到g是否是G的子图(和同构)? (请注意,以下是图表的边缘列表表示。)

G
1 2 c
1 3 d
1 4 c
2 3 a
...
g
1 3 d
2 3 a

在这种情况下,g是一个子图,与G同构,但如果我们有这样的东西:

g
1 3 t
2 3 a

现在g不再是G的子图,也不是同构的。

更新:两个图都是无向的。

1 个答案:

答案 0 :(得分:1)

  

g = {(1 2 a)}与G不同构,因为G中该边的权重是“c”而不是“a”。

这很奇怪。简单地说,如果存在来自{G < - > G'}的某个函数f,则图G,G'(实际上,任何代数结构)是isomorphic,因此对于任何关系R(g1,g2)(g1) G)中的g2,R'(f(g1),f(g2))也适用于G',反之亦然。因此,通过重命名(置换)顶点从G获得的任何图G'都与G同构。

看起来,你有兴趣弄清楚对于g的任何标记边缘是否存在连接相同顶点并在G中带有相同标记的边缘。最简单的方法是复制G的边缘并对它们进行排序按组件。然后对于查询g的每个边缘,将采用O(log(| G |))来检查G是否具有相同的边缘(并且它具有相同的标记)。因此,总时间为O(| G | * log(| G |))以准备图G和O(| g | * log(| G |))来处理每个后续查询。

<强> UPD: 通过“按组件对G的边缘进行排序”,我的意思如下:构建边的数组(或二叉树),按第一个顶点排序,然后按第二个顶点排序。要轻松搜索边缘,应该重复。例如,边(1,2,c)应该作为(1,2,c)和(2,1,c)存在。因此,在数组形式中,上面例子中的G变为

(1, 2, c)
(1, 3, d)
(1, 4, c)
(2, 1, c)
(2, 3, a)
(3, 1, d)
(3, 2, a)
(4, 1, c)

在事后的想法中,最好先用较小的数字写出G和g的两个边缘 - 这样就不需要重复了。