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