Визначення компоненти зв’язності в графі by lala najafova on prezi
Please log in to add your comment.
Transcript of Визначення компоненти зв'язності в графі
Визначення. Якщо граф не є зв'язковим, то він називається незв'язних.
Незв'язний граф складається з компонент зв'язності.
компонента зв'язності
- безліч вершин таке, що з будь-якої вершину цієї множини є шлях в будь-яку іншу вершину цієї множини, але ні з якої вершини цієї множини можна потрапити в деяку вершину поза цієї множини. Очевидно, що сума кількостей вершин компонент зв'язності дорівнює кількості вершин графа.
Зауважимо, що компонента зв'язності може складатися з однієї вершини. Якщо у графа n вершин, то він не може складатися з більш ніж n компонент зв'язності. У зв'язкового графа компонента зв'язності єдина.
Реалізація
алгоритму
Поняття зв'язності графа
Як визначити, чи є граф зв'язковим? І як визначити кількість компонент зв'язності?
Приклад: на малюнку трохи нижче граф є зв'язковим. Однак, скажімо, якщо видалити ребро між вершинами 4 і 5, то зв'язковим він не буде - з вершини 5 можна буде потрапити ні в яку іншу вершину.
Сильно зв'язний оргаф
Визначення. Граф називається зв'язковим, якщо для будь-яких двох його вершин v, w існує маршрут з v в w
Якщо граф зв'язний і без циклів (тобто це дерево), то видалення будь-якого ребра призведе до втрати зв'язності.
Визначення. Орграф називається односторонньо сильно зв'язковим, якщо для будь-яких його двох вершин, по крайней мере, одна досяжна з іншої.
На малюнку наведено граф з двома компонентами зв'язності.
У незв'язною графа будь-яка компонента зв'язності складається не більше, ніж з n-1 вершин. Якщо відомо, що у графа k компонент зв'язності, то даємо ще більш сувору оцінку: будь-яка компонента зв'язності складається з не більше, ніж з n-k + 1 вершин.
Якщо у незв'язною графа k компонент зв'язності, то для отримання зв'язкового графа потрібно додати в граф як мінімум k-1 ребро.
Вибираємо деяку вершину A і помічаємо її як відвіданих (1), інші відповідно покладаються ще не відвіданих (0):
Визначення компоненти зв'язності графа
A вважаємо поточної вершиною. Далі діємо в такий спосіб. Позначка невідвіданих суміжних вершин: для поточної вершини шукаємо суміжні з нею, ще не невідвіданих, і помічаємо їх як відвідані.
Нехай у нас виявилося k новопомеченних вершин (на малюнку трохи вище їх 3). По черзі вибираємо одну з них поточної і рекурсивно виконуємо позначку невідвіданих суміжних з нею вершин. Для поточної вершини не виконується рекурсія, якщо у даної вершини немає суміжних вершин, які все ще не позначені як відвідані.
Якщо після таких дій все вершини опиняться позначені як відвідані, граф зв'язний, інакше незв'язних.
Висновок: не всі вершини відвідали, граф виявився незв'язним.
Для реалізації трохи зручнішим є обхід в глибину:
int n;
vector
bool used [MAXN];
vector
void dfs (int v) used [v] = true;
comp.push_back (v);
for (size_t i = 0; i
dfs (to);
>
>
void find_comps () for (int i = 0; i
for (int i = 0; i
dfs (i);
cout <<"Component:";
for (size_t j = 0; j
>
алгоритм знаходження
кількості
компонента зв'язності.
Для вирішення можна скористатися як обходом в глибину, так і обходом в ширину.
Фактично, ми будемо виробляти серію обходів: спочатку запустимо обхід з першої вершини, і всі вершини, які він при цьому обійшов - утворюють першу компоненту зв'язності. Потім знайдемо першу з решти вершин, які ще не були відвідані, і запустимо обхід з неї, знайшовши тим самим другу компоненту зв'язності. І так далі, поки всі вершини не стануть поміченими.
Наджафова Лала ТК-31