Graph 如何检查带有标记顶点的两个图是否同构?

Graph 如何检查带有标记顶点的两个图是否同构?,graph,isomorphism,Graph,Isomorphism,例如,假设我有一个图G,它有所有的蓝色节点和一个红色节点。我还有一个图F,它有一个红色的节点和一个蓝色的节点 我可以运行什么算法来验证这两个图相对于它们的有色节点是同构的 只是检查一下;你是说严格图同构还是别的什么?同构图具有相同的邻接关系(即,如果一个图中的节点A与节点B相邻,则节点g(A)与另一个图中的节点g(B)相邻,这是将变换g应用于第一个图的结果…)如果您只想检查一个图是否具有与另一个图相同的节点类型和数量,那么您可以比较计数。我尝试创建了一个多项式图同构算法,虽然我还没有创建一个被证

例如,假设我有一个图G,它有所有的蓝色节点和一个红色节点。我还有一个图F,它有一个红色的节点和一个蓝色的节点


我可以运行什么算法来验证这两个图相对于它们的有色节点是同构的

只是检查一下;你是说严格图同构还是别的什么?同构图具有相同的邻接关系(即,如果一个图中的节点A与节点B相邻,则节点g(A)与另一个图中的节点g(B)相邻,这是将变换g应用于第一个图的结果…)如果您只想检查一个图是否具有与另一个图相同的节点类型和数量,那么您可以比较计数。

我尝试创建了一个多项式图同构算法,虽然我还没有创建一个被证明适用于每种情况的多项式算法,我提出的一个算法特别适合这个目的。它基于DFA最小化算法(具体的算法是;你可能想从别处找到描述,因为维基百科很难遵循)

原始算法是通过基于度将顶点组织成不同的组来初始化的(一组用于度1的顶点,一组用于度2的顶点,等等)。出于您的目的,您需要根据度和标签将顶点组织为组;这将确保如果两个节点具有不同的标签,则不会有两个节点配对。每个图都应该有自己的包含这些组的结构。检查两个图的组集合;两个图形的组数应该相同,对于一个图形中的每个组,另一个图形中应该有一个包含相同次数的顶点和标签的组。如果不是这样,那么这些图就不是同构的

在主算法的每次迭代中,您应该为下一步将使用的顶点组的两个图形中的每一个生成新的数据结构。对于每个组,为组索引/ID的每个顶点生成一个列表,这些索引/ID对应于与相关顶点相邻的顶点(在此列表中包括重复的组)。检查每个组,查看每个包含顶点的已排序组索引/ID列表是否相同。如果是这种情况,请在下一步的组结构中创建此组的未修改副本。如果情况并非如此,则对于该组中每个组索引/ID的唯一列表,为生成该列表的原始组中的顶点创建一个新组,并将该新组添加到下一步的组结构中。如果在给定的迭代中未细分任一图形的任何组,请停止运行此算法的主要部分。如果您至少细分了一个组,则需要再次检查以确保两个图形的组结构彼此对应。此检查类似于在算法初始化结束时执行的检查(您甚至可以对两者使用相同的函数)。如果该检查失败,则图形不是同构的。如果检查通过,则放弃/释放当前组结构,并使用新创建的组结构开始下一次迭代

为了简化确定“对应组”的过程,我强烈建议使用可预测的方案将组添加到结构中。例如,如果在初始化过程中按(度、标签)顺序添加组,按升序索引顺序细分组,并根据组索引列表的顺序(即按第一个列出的索引排序,然后按第二个索引排序等)将细分组添加到新结构中,然后,两个组结构之间的对应组将始终具有相同的索引,这使得跟踪哪些组彼此对应的过程更加容易

如果在算法完成时所有组都包含3个或更少的顶点,则图是同构的(对于包含2个或3个顶点的对应组,任何顶点对都是有效的)。如果情况并非如此(这总是发生在所有节点都具有相同次数和标签的图上,有时也发生在具有该属性的子图上),那么这些图尚未确定为同构或非同构。要区分这两种情况,请选择第一个图形最大组的任意节点,并将其划分为自己的组。然后,对于另一个图的最大组中的每个节点,再次尝试运行算法,将该节点分成自己的组。本质上,您是从第一个图中选择一个未配对的节点,并通过猜测和检查将其配对到第二个图中仍然是合理配对的每个节点。如果任何分叉迭代返回同构,则图是同构的。如果它们都不同构,那么这些图就不是同构的

对于一般情况,该算法是多项式的。在角点情况下,算法可能是指数的。无论这种情况是否发生,都与算法在图形输入和节点选择这两种最坏情况下被迫分叉的频率有关,我在尝试设置有用的界限时遇到了困难。例如,当比较两个完整图时,虽然算法在每一步都会分叉,但该树的每个分支都会产生同构;因此,在这种情况下,算法以多项式时间返回,即使遍历整个执行树需要指数时间,因为只遍历执行树的一个分支需要多项式时间


无论如何,这个算法应该适合您的目的。我希望我的解释是可以理解的;如果没有,我可以尝试提供处理简单情况的算法示例或将其表示为伪代码。

几年前,我创建了一个简单而灵活的算法来解决这个问题(图同构与