Перейти до основного вмісту

Підрахунок позначених графів

Позначені графи

Нехай кількість вершин у графі дорівнює nn. Нам потрібно обчислити кількість GnG_n позначених графів з nn вершинами (позначений означає, що вершини пронумеровані числами від 11 до nn). Ребра графів вважаються неорієнтованими, а петлі та кратні ребра заборонені.

Розглянемо множину всіх можливих ребер графа. Для кожного ребра (i,j)(i, j) ми можемо вважати, що i<ji < j (бо граф неорієнтований і немає петель). Тому множина всіх ребер має потужність (n2)\binom{n}{2}, тобто n(n1)2\frac{n(n-1)}{2}.

Оскільки будь-який позначений граф однозначно визначається своїми ребрами, кількість позначених графів з nn вершинами дорівнює:

Gn=2n(n1)2G_n = 2^{\frac{n(n-1)}{2}}

Зв'язні позначені графи

Тут ми додатково накладаємо обмеження, що граф має бути зв'язним.

Позначимо шукану кількість зв'язних графів з nn вершинами як CnC_n.

Спочатку обговоримо, скільки існує незв'язних графів. Тоді кількість зв'язних графів дорівнюватиме GnG_n мінус кількість незв'язних графів. Більше того, ми порахуємо кількість незв'язних графів із коренем. Граф із коренем — це граф, у якому ми виділяємо одну вершину, позначаючи її як корінь. Очевидно, що у нас є nn можливостей обрати корінь графа з nn позначеними вершинами, тому наприкінці нам потрібно буде поділити кількість незв'язних графів із коренем на nn, щоб отримати кількість незв'язних графів.

Коренева вершина опиниться в компоненті зв'язності розміру 1,n11, \dots n-1. Існує k(nk)CkGnkk \binom{n}{k} C_k G_{n-k} графів таких, що коренева вершина перебуває в компоненті зв'язності з kk вершинами (є (nk)\binom{n}{k} способів обрати kk вершин для компоненти, вони з'єднані одним із CkC_k способів, кореневою вершиною може бути будь-яка з kk вершин, а решту nkn-k вершин можна з'єднати/роз'єднати будь-яким чином, що дає множник GnkG_{n-k}). Тому кількість незв'язних графів з nn вершинами дорівнює:

1nk=1n1k(nk)CkGnk\frac{1}{n} \sum_{k=1}^{n-1} k \binom{n}{k} C_k G_{n-k}

І нарешті, кількість зв'язних графів дорівнює:

Cn=Gn1nk=1n1k(nk)CkGnkC_n = G_n - \frac{1}{n} \sum_{k=1}^{n-1} k \binom{n}{k} C_k G_{n-k}

Позначені графи з kk компонентами зв'язності

Спираючись на формулу з попереднього розділу, ми навчимося рахувати кількість позначених графів з nn вершинами та kk компонентами зв'язності.

Це число можна обчислити за допомогою динамічного програмування. Ми обчислимо D[i][j]D[i][j] — кількість позначених графів з ii вершинами та jj компонентами — для кожних ini \le n та jkj \le k.

Обговоримо, як обчислити наступний елемент D[n][k]D[n][k], якщо ми вже знаємо попередні значення. Скористаємося поширеним підходом — візьмемо останню вершину (індекс nn). Ця вершина належить деякій компоненті. Якщо розмір цієї компоненти дорівнює ss, то є (n1s1)\binom{n-1}{s-1} способів обрати такий набір вершин і CsC_s способів їх з'єднати. Після вилучення цієї компоненти з графа у нас залишається nsn-s вершин із k1k-1 компонентами зв'язності. Тому ми отримуємо таке рекурентне співвідношення:

D[n][k]=s=1n(n1s1)CsD[ns][k1]D[n][k] = \sum_{s=1}^{n} \binom{n-1}{s-1} C_s D[n-s][k-1]

Відеоматеріали