Хм, придумалось судя по всему неправильное решение (жадное). Но интересно где проблема.
UPD: Понял где проблема.
Лемма 1 Два полных непересекающихся подграфа (без общих вершин) размера m и n соответственно между вершинами которых есть m*n ребер образуют полный подграф с m*n вершин.
Запихиваем все вершины в СНМ (Система непересекающихся множеств). Каждая вершина -- полный подграф размера 1. Дальше в процессе обхода "сливаем" полные подграфы.
Для этого храним map: (subgraph1, subgraph1) -> numOfConnections. Каждый раз когда встречаем ребро -- с помощью СНМ находим к каким подграфам относятся вершины и увеличиваем значение в map (или добавляем единицу, если ключа не было). Если значение оказалось больше чем произведение размеров подграфов -- сливаем их.
UPD: проблема жадного алгоритма в том, что мы получим не максимальный подграф. Иногда делать очередное слияние не выгодно. Например есть маленький подграф А, и 2 больших B и C. B можно слить с С или с А, но все 3 не образуют полный граф. Тогда если мы сольем B и A, то оптимальное решение уже не получится.