@neuroepoc

Как в графе найти самый «большой» полный подграф?

Другими словами, есть набор точек (от 250000 до 1000000), которые случайным образом связаны между собой. Среди этих точек нужно найти, такие N точек, каждая из которых связана с оставшимися N-1 точками, при этом, чтобы N было максимальным.
  • Вопрос задан
  • 2525 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Это штатная задача, т.н. «задача о клике», NP-полная. Ничего лучше усовершенствованного перебора не существует.
https://ru.wikipedia.org/wiki/Алгоритм_Брона_—_Кербоша
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Найти все подграфы, выбрать из них самый большой.
Ответ написан
@syrov
пишу программы до 99 строк
Это можно выполнить с помощью depth first search в линейное время. Выбрать вершину, выполнить от нее dfs помечая вершины как 0, затем выбрать другую (еще не помеченную) вершину, итд. Одновременно вести учет к-ва вершин в каждом подграфе.
Ответ написан
tsarevfs
@tsarevfs
C++ developer
Хм, придумалось судя по всему неправильное решение (жадное). Но интересно где проблема.
UPD: Понял где проблема.
Лемма 1 Два полных непересекающихся подграфа (без общих вершин) размера m и n соответственно между вершинами которых есть m*n ребер образуют полный подграф с m*n вершин.
Запихиваем все вершины в СНМ (Система непересекающихся множеств). Каждая вершина -- полный подграф размера 1. Дальше в процессе обхода "сливаем" полные подграфы.
Для этого храним map: (subgraph1, subgraph1) -> numOfConnections. Каждый раз когда встречаем ребро -- с помощью СНМ находим к каким подграфам относятся вершины и увеличиваем значение в map (или добавляем единицу, если ключа не было). Если значение оказалось больше чем произведение размеров подграфов -- сливаем их.

UPD: проблема жадного алгоритма в том, что мы получим не максимальный подграф. Иногда делать очередное слияние не выгодно. Например есть маленький подграф А, и 2 больших B и C. B можно слить с С или с А, но все 3 не образуют полный граф. Тогда если мы сольем B и A, то оптимальное решение уже не получится.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы