Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АиПА / Лекции / 7_Задачи на графах.doc
Скачиваний:
16
Добавлен:
07.02.2016
Размер:
113.66 Кб
Скачать

Int iso(graf& a, graf& b)

{ int i, j, k, s, sp, n = A.nv;

int f[n], st[n];

for (i = 0; i < n; i++) { f[i] = i; st[i] = 0; }

matad MA = A, MB = B;

for (k = 0; k < n; k++) // k - позиция стартовой вершины в Bv

{ swp(f[0], f[k]); // f[k] - номер стартовой вершины в B

for (sp = 1; sp < n; sp++) // sp - число вершин найденного общего подграфа

{ s = sp;

mmm:

for (i = s; i< n; i++) // i - вершина-кандидат на включение в ОП

{ for (j = 0; j < sp; j++) // проверка вершины-кандидата

if (MB.s[f[i]][f[j]] != MA.s[sp][j]) break;

if (j == sp) { swp(f[sp], f[i]); st[sp] = i; break; } // найденная вершина ставится на место в массиве f и запоминается в массиве st

}

if (i == n) { sp--; // если i==n, успешная вершина не найдена

if (sp == 0) break;

swp(f[sp], f[st[sp]]); // восстановление f

s = st[sp] + 1; goto mmm; // возврат на пред. уровень

}

}

if (sp == n) break; // если sp==n, изоморфизм найден

}

return k < n ? 1 : 0 ; // если k==n, изоморфизм не существует

}

Основные обозначения, используемые в программе:

A,B - исходные графы;

graf, matad - классовые типы, представляющие граф в виде таблицы связей и матрицы смежности, соответственно;

A.nv - число вершин графа A (предполагается A.nv==B.nv);

A.p[i] - степень i-той вершины графа A;

M.s[i][k] - элемент матрицы смежности M с индексами i,k;

f[] - массив, представляющий искомую подстановку;

st[] - рабочий массив, используемый для восстановления информации в случае возврата;

sp - текущее число вершин общего подграфа;

Функция iso(A,B) возвращает 1, если графы изоморфны, и 0 - если нет. Работа функции завершается после отыскания первой изоморфной подстановки.

Модифицированный ПНВ-алгоритм

Исследование функции iso1 на случайных графах выявило ее существенный недостаток: при малом или наоборот большом относительном реберном заполнении время выполнения функции многократно (на несколько порядков!) возрастает. На рис. показана зависимость среднего времени выполнения функции iso1 от относительного реберного заполнения для случайных графов с n = 40 .

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

Фрагменты <1>,<2> выполняют упорядочивание номеров вершин в массивах Av, Bv, соответственно, по убыванию их степеней. Фрагмент <3> выполняет дополнительное упорядочивание вершин в массиве Av по такому принципу: на очередную позицию с номером k выбирается номер вершины из одной из последующих позиций так, чтобы соответствующая ей вершина имела максимальное число связей с вершинами, записанными в позициях 0, 1 , ... , k-1 . Такое упорядочивание может значительно уменьшать средний коэффициент ветвления дерева поиска.

Библиотечный вариант приведенной функции при тестировании показывает такой результат: при использовании процессора Pentium 3.0 Ггц для случайных графов при n=2000 и половинном реберном заполнении ( r=999500) время счета в среднем составляет 3.3 с.