Algorithm 加权子图同构

Algorithm 加权子图同构,algorithm,graph,subgraph,isomorphism,Algorithm,Graph,Subgraph,Isomorphism,我已经连续两到三天在互联网上搜索了这篇文章,但到目前为止运气不好 我知道在野外有很多关于子图同构的库和实现,但它们都适用于未加权图。例如,两种最流行的算法是VF2和Uleman算法。在这里,我的问题是:有没有任何方法可以给出一个图(G)和一个查询图(G),我们可以找到G是否是G的子图(和同构)?(请注意,以下是图形的边列表表示形式。) 在这种情况下,g是一个子图,与g同构,但如果我们有类似的东西: g 1 3 t 2 3 a 现在g不再是g的子图,也不是同构的 更新:两个图都是无向的 g={(

我已经连续两到三天在互联网上搜索了这篇文章,但到目前为止运气不好

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

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

g
1 3 t
2 3 a
现在g不再是g的子图,也不是同构的

更新:两个图都是无向的

g={(12a)}与g不同构,因为g中此边的权重是“c”而不是“a”

这很奇怪。简单地说,图G,G’(实际上,任何代数结构)是如果存在来自{GG'}的函数f,那么对于任何关系R(g1,g2)(G中的g1,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的两条边,其中顶点的数目要小一些,这样就不需要重复。

只是要清楚,G={(1 2 a)}同构于G的一个子图(即,{(2 3 a)})。这就是你想要的结果吗?此外,G是否有方向(即G={(13D),(32A)}的输出是否应为“否)?G={(12A)}与G不同构,因为G中此边的权重是“c”而不是“a”。对于第二种情况,即g={(13d),(32a)},它应该返回TRUE。简单地说,这两个图都是无向的,谢谢你的回答。这是简明扼要的。我几乎明白了解决办法。然而,有一点我不明白。按组件对边进行排序是什么意思?为什么我需要复制G中的边?我确信O(log(| G |)的复杂性与组件有关,但我不明白它背后的意思。@YaserKenesh做了一个更新。您可以使用二进制搜索对G的边进行排序数组。最简单的排序方法是:对边E1=(a,b,mark1),E2=(c,d,mark2)谢谢你,我知道使用字典顺序可以完成这项工作。我希望能找到一种更好的最佳方法。不过,目前似乎还没有最佳的解决方案。
(1, 2, c)
(1, 3, d)
(1, 4, c)
(2, 1, c)
(2, 3, a)
(3, 1, d)
(3, 2, a)
(4, 1, c)