用于确定2个图是否是同构的算法

时间:2010-10-06 19:58:02

标签: algorithm language-agnostic graph graph-theory

免责声明:我是图论的新手,我不确定这是否属于SO,Math SE等。

给定2个邻接矩阵A和B,我如何确定A和B是否同构。

例如,A和B不是同构的,C和D是同构的。

A = [ 0 1 0 0 1 1     B = [ 0 1 1 0 0 0
      1 0 1 0 0 1           1 0 1 1 0 0
      0 1 0 1 0 0           1 1 0 1 1 0
      0 0 1 0 1 0           0 1 1 0 0 1
      1 0 0 1 0 1           0 0 1 0 0 1
      1 1 0 0 1 0 ]         0 0 0 1 1 0 ]

C = [ 0 1 0 1 0 1     D = [ 0 1 0 1 1 0
      1 0 1 0 0 1           1 0 1 0 1 0
      0 1 0 1 1 0           0 1 0 1 0 1
      1 0 1 0 1 0           1 0 1 0 0 1
      0 0 1 1 0 1           1 1 0 0 0 1
      1 1 0 0 1 0 ]         0 0 1 1 1 0 ]   

(sorry for this ugly notation, I'm not quite sure how to draw matrices on SO)

以下是我开始算法的原因(请原谅我缺乏数学严谨性)请帮我完成/纠正!

  1. 如果A!的尺寸(边数,在这种情况下是1s的量),则B =>的尺寸。图不是同构的
  2. 对于A的每个顶点,计算其度数并在B中查找具有相同度之前未匹配的匹配顶点。如果没有匹配=>图表不是同构的。
  3. 现在我们不能很快证明A和B不是同构的,下一步是什么? 是否正确尝试A中每一行的排列直到A匹配B?真的不确定这一个......

4 个答案:

答案 0 :(得分:7)

这是一个很难解决的问题。有关于它的维基百科页面:

根据该页面,有许多特殊情况已经用有效的多项式时间解决方案解决,但最优解的复杂性仍然未知。

答案 1 :(得分:4)

我的项目 - Griso - 位于sf.net:http://sourceforge.net/projects/griso/,其描述如下:
Griso是一个用C ++编写的图形同构测试实用程序,它基于我自己的算法 请参阅此页面上的Griso示例输入/输出:http://funkybee.narod.ru/graphs.htm

答案 2 :(得分:0)

嗯,通过执行以下操作很容易快速判断出它们不是同构的。 areIsomorphic(G1, G2): if(G1.num_verticies != G2.num_verticies) return False if(G1.num_total_edges != G2.num_total_edges) return False for each vertex v in G1: if( G2.find(v).edges != v.edges): return False; //Try and find a property in graph G1 that does not exist in G2. // Use a heuristic. ie- try and find nonmutually adjacenct sets.

答案 3 :(得分:0)

一般来说,证明两个图是同构的并不是一件简单的事情。出于这个原因,我们必须考虑同构图的一些性质。这意味着如果图是同构的,则必须满足这些属性。如果给定的图不满足这些性质,那么我们可以说它们不是同构图。

性质:两个图是同构的,当且仅当它们的顶点的某些排序它们的邻接矩阵相等。

基于上述性质,我们可以决定给定的图是否同构。为了检查属性,我们需要做一些矩阵变换操作。