2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


В этом разделе нельзя создавать новые темы.

Если Вы хотите задать новый вопрос, то не дописывайте его в существующую тему, а создайте новую в корневом разделе "Помогите решить/разобраться (М)".

Если Вы зададите новый вопрос в существующей теме, то в случае нарушения оформления или других правил форума Ваше сообщение и все ответы на него могут быть удалены без предупреждения.

Не ищите на этом форуме халяву, правила запрещают участникам публиковать готовые решения стандартных учебных задач. Автор вопроса обязан привести свои попытки решения и указать конкретные затруднения.

Обязательно просмотрите тему Правила данного раздела, иначе Ваша тема может быть удалена или перемещена в Карантин, а Вы так и не узнаете, почему.



Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 максимальная клика в графе
Сообщение12.01.2006, 20:58 


30/12/05
11
Добрый вечер! :D Это опять я :D
Мне нужно :!: найти :shock: максимальную :idea: клику :arrow: в графе , как это делается? 8-)


P.S. :libmexmat:

 Профиль  
                  
 
 
Сообщение12.01.2006, 21:51 
Экс-модератор


12/06/05
1595
MSU
Мне кажется, вы злоупотребляете смайликами.

Что такое "клика"?

 Профиль  
                  
 
 
Сообщение12.01.2006, 21:58 


30/12/05
11
Больше не буду смайличать :)

Из учебника: Клика- это максимальный полный подграф.

У нас ещё небыло графов, так что я никак не разберусь как найти это.

 Профиль  
                  
 
 
Сообщение12.01.2006, 22:09 
Заслуженный участник
Аватара пользователя


09/10/05
1142
по моему аналогичная тема уже обсуждалась... что мешает самому графу быть подграфом самого себя?

 Профиль  
                  
 
 
Сообщение12.01.2006, 22:24 


30/12/05
11
действительно, есть тема созданная Java.

Странно, то есть получается сам граф? :roll:

Сомниваюсь, что будут давать специальное задание с вопросом "Сколько углов у четырёхугольника?" Может решение не столь тревиальное? Помогите пожалуйста.

 Профиль  
                  
 
 
Сообщение12.01.2006, 22:33 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Сначала ответьте, речь идет об учебном задании или промышленной задаче?

Подобные алгоритмы приведены в большинстве книг по соответствующим темам. Если задача промышленная, речь идет о больших графах и найти нужно быстро, то надо читать их. Если же нужно сделать учебную программу, то простой алгоритм придумать довольно легко.

 Профиль  
                  
 
 
Сообщение12.01.2006, 22:40 


30/12/05
11
нужно для учебных целей. Граф маленький, до 10 вершин.
Цитата:
Если же нужно сделать учебную программу, то простой алгоритм придумать довольно легко.

Можете по-подробней рассказать о алгоритме?

 Профиль  
                  
 
 
Сообщение12.01.2006, 22:44 


29/12/05
6
Мехмат МГУ
Как уже было сказано,

alanta писал(а):
Клика- это максимальный полный подграф.


Полный - это значит, что любые две вершины соединены ребром. Ясно, что весь граф может не быть полным. Поэтому эта задача вовсе не тривиальная. Более того, проверка того, что в данном графе имеется клика из заданного числа элементов является NP-полной! То есть, грубо говоря, ее решение можно проверить за полиномиальное время, но скорее всего, решить за полиномиальное время нельзя.

Однако для маленьких графов вполне пройдет переборный алгоритм.


Рекомендую следующие книги:

В.А. Емеличев и др., "Лекции по теории графов", стр. 111.
Кормен, Лейзерсон, Ривест, "Алгоритмы: построение и анализ", стр. 864.

а также множество книг из этой библиотеки по теории графов.

 Профиль  
                  
 
 
Сообщение12.01.2006, 22:55 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Пусть вершины упорядочены. Будем обозначать их v1...vn.

В каждый момент у нас будет пара (G,vi), где G - некоторый полный подграф (возможно, пустой), vi - некоторая вершина, не входящая в G. Также будем помнить максимальный найденный полный подграф Gmax.

В начале работы G=Gm=0 (пустой), vi=v1.

Прямой ход алгоритма заключается в том, что мы проверяем, можно ли добавить к имеющемуся графу G вершину vi. Для этого надо перебрать все вершины в G и проверить, соединены ли они все с vi. Если да, то добавляем vi к G. Затем переходим к вершине v(i+1) и так до тех пор, пока не пройдем все вершины. После этого G будет некоторым максимальным подграфом (не обязательно кликой). Его надо сравнить с Gmax и если он больше, то заменяем Gmax на G.

После этого находим в G вершину с максимальным номером vj, удаляем его из G и проходим снова прямой ход начиная с пары (G,v(j+1)).

Вроде как должно работать.

Далее можно накручивать разные штуки, ускоряющие перебор.

 Профиль  
                  
 
 
Сообщение12.01.2006, 23:08 
Заслуженный участник
Аватара пользователя


09/10/05
1142
Цитата:
Полный - это значит, что любые две вершины соединены ребром

PAV писал(а):
Прямой ход алгоритма заключается в том, что мы проверяем, можно ли добавить к имеющемуся графу G вершину vi. Для этого надо перебрать все вершины в G и проверить, соединены ли они все с vi. Если да, то добавляем vi к G.


Я конечно не специалистка в алгоритмах и в графах, но зачем-же проверять все? По моему достаточно проверить соседнюю, т.к. уже подразумевается, что она соединена с предыдущими проверенными. Или Вы имеете ввиду прямое соединение? Но по моему, это звучит страно, т.к. тогда нельзя сказать, что они все вершины. Дело в том, что логика подсказывает мне - вершины должны лежать на одном уровне или по меньшей мере не иметь соединения, если лежат на разных. То есть вершина не должна иметь соединения с узлом верхнего уровня. Или?

 Профиль  
                  
 
 
Сообщение12.01.2006, 23:24 
Заслуженный участник
Аватара пользователя


09/10/05
1142
Я вот считаю странным, если у графа $ n $ вершин, у него что-же $ n ! $ соединений? Ведь если бы они были соединены через узлы, то было бы $ n - 1$. По моему так работает интернет, сложно представить себе что все серверы мира имеют прямое соединение между собой :shock: :shock: :shock:

 Профиль  
                  
 
 
Сообщение12.01.2006, 23:26 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
PAV писал(а):
После этого находим в G вершину с максимальным номером vj, удаляем его из G и проходим снова прямой ход начиная с пары (G,v(j+1)).

Вроде как должно работать.

Не отрицая, что это проходимо (я, правда, запутался в удалении/добавлении -- тут не очень понятно), я бы порекомендовал рекурсивный подход.

Код:
clique(G):
  Gmax = max(Gmax, G)
  for each v after G:
     if v can be added to G:
        clique(G + v)                       // ***
     endif
   endfor

Сложность решения - как и положено - экспоненциальная, ведь мы проверяем $2^n$ подграфов.

Стоимость копирования Gmax пренебрежима, так как мы копируем не более $n$ раз. А вот копирование G можно избежать, заменяя clique(G + v) на
Код:
        // clique(G + v)
        G += v
        clique(G)
        G -= v

Может быть это именно то, что имел в виду PAV?

 Профиль  
                  
 
 
Сообщение12.01.2006, 23:49 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Capella писал(а):
Я вот считаю странным, если у графа $ n $ вершин, у него что-же $ n ! $ соединений? Ведь если бы они были соединены через узлы, то было бы $ n - 1$.

Мне кажется, Вы путаете понятия связанности и соединения. Две вершины соединены, если существует ребро с началом в одной, и концом в другой. Две вершины связанны, коли существует цепочка ребер из одной в другую. Построение матрицы связей по матрице соединений - одна из классических задач (очень популярна в начальных курсах по теории компиляции). Соединений может быть не более $ n $ (вершина может быть соединена сама с собой), а связей - до хрена...

 Профиль  
                  
 
 
Сообщение12.01.2006, 23:51 
Заслуженный участник
Аватара пользователя


09/10/05
1142
Ага, да тут лингвистом надо прямо быть :wink: Я-же чувствовала, что здесь что-то не то. Спасибо!

 Профиль  
                  
 
 
Сообщение13.01.2006, 00:08 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
незванный гость писал(а):
Может быть это именно то, что имел в виду PAV?


Да, по-моему это тот же алгоритм, только использована рекурсия, а у меня - циклы.
Привычка - стараюсь избегать рекурсий.

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group