代码之家  ›  专栏  ›  技术社区  ›  Olivier Lalonde Danny

判定2图是否同构的算法

  •  8
  • Olivier Lalonde Danny  · 技术社区  · 16 年前

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

    给定两个邻接矩阵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. 如果尺寸(边数,在本例中为1s)为A!=B的大小=>图不是同构的
    2. 对于A的每个顶点,计算其度数并在B中查找具有相同度数的匹配顶点 和 之前没有匹配。如果没有匹配,则表示图不是同构的。
    3. 既然我们不能很快证明A和B不是同构的,下一步怎么办? 在A与B匹配之前,尝试A中每一行的排列是否正确?真的不确定这个。。。
    3 回复  |  直到 16 年前
        1
  •  7
  •   Mark Byers    16 年前

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

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

        2
  •  4
  •   trg787    15 年前

    我的项目-Griso-atsf.net公司: http://sourceforge.net/projects/griso/ 描述如下:
    GRISO是一个图形同构测试工具,用C++编写,基于我自己的ALGO。
    见本页Griso的示例输入/输出: http://funkybee.narod.ru/graphs.htm

        3
  •  0
  •   Alex Spencer    11 年前

    好吧,很容易通过下面的操作快速判断它们不是同构的。 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.