Есть много аспектов этого вопроса, которые не полностью объяснены, поэтому я собираюсь дать несколько исчерпывающий ответ. Несмотря на мою склонность публиковать текстовые стены. : / Обратите внимание, что я предполагаю, что это домашнее задание или вопрос самообразования, поэтому я не собираюсь давать прямой ответ.
Два основных алгоритма обнаружения связности графа: Поиск в глубину и Поиск в ширину . Это действительно две отправные точки, которые вы хотите посмотреть. Оба приведут вас к решению, но по-разному, и трудно поспорить, что «лучше», не рассматривая некоторые довольно глубокие аспекты проблемы. Но давайте двигаться дальше.
Как я упоминал ранее, вы пропустили некоторые важные детали, и я коснусь некоторых возможностей здесь.
Ваш график направлен или ненаправлен? и рассматриваете ли вы связность в «сильном» смысле (в этом случае см. ответ Огги) или связность в «слабом» смысле? В зависимости от вашего ответа, вам придется немного приблизиться к вашему алгоритму. Обратите внимание, что для неориентированного графа слабая и сильная связность эквивалентны, так что это хорошо. Но вы должны будете помнить структуру графа независимо от того, реализуете ли он алгоритм или находите его.
Кроме того, возникает вопрос о том, что вы подразумеваете под «нахождением подграфов» (перефразируя). Обычно связность графа является проблемой решения - просто «есть один связный граф» или «есть два или более подграфа (иначе он отключен)». Наличие алгоритма для этого требует наименьшего количества книг, что приятно. :) Следующим шагом будет граф графов, буквально их число, и эта книжная работа также не так уж и плоха. Предположительно, вам может потребоваться список узлов в каждом подграфе. Наконец, вы можете буквально скопировать подграфы, ребра и все (поэтому возвращаемый тип будет списком графов, я полагаю, с подразумеваемым инвариантом, что каждый граф связан). Ни один из этих разных типов результатов не потребует другого алгоритма, но , безусловно, потребует другого подхода к работе с книгами.
Все это может показаться нелепым излишним из-за довольно простого вопроса, но я подумал, что просто выделю все аспекты, связанные даже с таким простым графическим вопросом. Обратите внимание на то, как ничего из этого не затрагивает время выполнения или использование памяти! :)
- Агор