Блог пользователя Nogaybica

Автор Nogaybica, история, 6 часов назад, По-русски

Что это такое?

Паросочетание — набор попарно несмежных рёбер графа.

Максимальное паросочетание — паросочетание, мощность которого максимальна среди всех возможных паросочетаний в данном графе.

Мощность паросочетания — количество рёбер в нём.

Как их находить? Существует алгоритм Куна, который основывается на поиске увеличивающихся цепей, пока ищется, и проведении чередования в них.

Код: C++ vector<vector>g; vectormatch; vectorused; bool kun(ll v) { if (used[v])return false; used[v] = true; for (auto& u : g[v]) { if (match[u] == -1) { match[u] = v; return true; } } for (auto& u : g[v]) { if (kun(match[u])) { match[u] = v; return true; } } return false; }

Где: g — списки смежности match[i] — вершина из левой доли, которая сопоставлена вершине i из правой доли used — была ли посещена вершина

Для нахождения максимального паросочетания необходимо произвести запуск данного алгоритма от каждой вершины левой доли (каждый раз надо чистить массив used).

Асимптотика — O(n*m)

P.S. Для ускорения я используется два раздельных цикла в самом алгоритме, т.к. сначала проверяются все вершины и ищется "несматченная" вершина, а это дает неплохое ускорение (только в частных случаях)

  • Проголосовать: нравится
  • -4
  • Проголосовать: не нравится