Алгоритм определения изоморфности 2 графов

отказ от ответственности: я новичок в теории графов, и я не уверен, что это относится к 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. If размер (количество ребер, в этом случае количество 1s) Of A != размер B => графики не изоморфны
  2. для каждой вершины A подсчитайте ее степень и найдите подходящую вершину в B, которая имеет одинаковую степень и ранее не было сопоставлено. Если нет совпадения => графики не изоморфны.
  3. теперь, что мы не можем быстро доказать, что A и B не изоморфны, каков следующий шаг? Было бы правильно попробовать каждую перестановку строк в A до тех пор, пока A не совпадет с B? Действительно не уверен в этом один...

3 ответов


Это довольно сложная проблема, чтобы решить. Об этом есть страница Википедии:

согласно этой странице существует ряд частных случаев, которые были решены с помощью эффективных полиномиальных временных решений, но сложность оптимального решения по-прежнему неизвестна.


мой проект-Griso-at sf.net:http://sourceforge.net/projects/griso/ с этим описанием:
Griso-это утилита тестирования изоморфизма графа, написанная на C++ и основанная на моем собственном algo.
См. пример ввода/вывода Griso на этой странице:http://funkybee.narod.ru/graphs.htm


ну, очень легко быстро сказать, что они не изоморфны, выполнив следующее. 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.