ВНИМАНИЕ

Для заказа программы на графы и графовые алгоритмы пишите на мой электронный адрес proglabs@mail.ru

В этой статье-шпаргалке покажу алгоритм нахождения степеней вершин в неориентированном невзвешенном графе.

Например, есть такой помеченный граф, состоящий из $9$ вершин:

неориентированный невзвешенный граф, состоящий из $9$ вершин

Рисунок — неориентированный невзвешенный граф, состоящий из $9$ вершин

Степенью вершины неориентированного графа называется количество ребер, инцидентных этой вершине.

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

Хочу посмотреть на вершину $5$ и рассчитать ее степень. Для этого нужно отобрать все ребра, инцидентные этой вершине:

вычисление степени вершины №$5$

Рисунок — вычисление степени $5$-ой вершины

➡ Из рисунка видно, что $5$-ой вершине инциденты только $3$ ребра. Следовательно, степень вершины с меткой $5$ равна $3$.

На всех последующих изображениях степени вершин будут показаны рядом с вершиной синим цветом шрифта.

степень $5$-ой вершины равна $3$

Рисунок — степень $5$-ой вершины равна $3$

Теперь я проставлю степени для каждой вершины графа:

вершины графа с их степенями

Рисунок — вершины графа с их степенями

Самая частая степень — это $3$. Одна вершина ( с меткой $9$ ) имеет степень, равную $1$, а еще одна ( с меткой $8$ ) — $5$.

💡 Есть такая очевидная зависимость между количеством ребер неориентированного графа и суммой степеней всех его вершин:

сумма степеней вершин графа равна удвоенному числу его ребер.

Общее количество ребер исходного графа — $15$ шт.

Сумма степеней всех вершин, начиная с первой по порядку: $4\ +\ 4\ +\ 3\ +\ 4\ +\ 3\ +\ 3\ +\ 3\ +\ 5\ +\ 1\ =\ 30$

➡ $30\ =\ $$2$$\ \cdot 15$ — истина!

Все расчеты, приведенные выше, были выполнены визуально. Поэтому я ставлю такой вопрос:

Как программно определить степень каждой вершины заданного неориентированного графа?

Для этого нужно заданный граф отобразить в структуры данных. Я воспользуюсь классической матрицей смежности ( квадратная матрица порядка $n$ ( $n$ — количество вершин ), состоящая из $0$ и $1$ ).

  $1$ $2$ $3$ $4$ $5$ $6$ $7$ $8$ $9$
$1$ $0$ $1$ $1$ $1$ $0$ $1$ $0$ $0$ $0$
$2$ $1$ $0$ $0$ $0$ $0$ $0$ $1$ $1$ $1$
$3$ $1$ $0$ $0$ $1$ $1$ $0$ $0$ $0$ $0$
$4$ $1$ $0$ $1$ $0$ $0$ $0$ $1$ $1$ $0$
$5$ $0$ $0$ $1$ $0$ $0$ $1$ $0$ $1$ $0$
$6$ $1$ $0$ $0$ $0$ $1$ $0$ $0$ $1$ $0$
$7$ $0$ $1$ $0$ $1$ $0$ $0$ $0$ $1$ $0$
$8$ $0$ $1$ $0$ $1$ $1$ $1$ $1$ $0$ $0$
$9$ $0$ $1$ $0$ $0$ $0$ $0$ $0$ $0$ $0$

Степенью $i$-ой вершины будет сумма всех единиц $i$-ой строки ( или колонки ) этой матрицы смежности. Закодировать этот тривиальный алгоритм, разумеется, элементарно.

➡ Вот пример программы на языке Си, которая на вход принимает неориентированный граф в формате матрицы смежности, а в качестве ответа выпечатывает на экран степень каждой вершины графа.

Результаты работы программы:

результаты работы программы

Рисунок — результаты работы программы

Какова сложность алгоритма нахождения степеней вершин в неориентированном графе?

Чтобы посчитать степень одной ( любой ) вершины, нужно просмотреть всю строку в матрице смежности. Эта строка, по сути, одномерный массив, состоящий из $0$ и $1$ длины $n$, где $n$ — количество вершин графа. То есть сложность алгоритма определения степени конкретной вершины графа составляет $O$$( n )$, а поскольку требуется понять сложность определения всех вершин графа, которых $n$ штук, то общая алгоритмическая сложность будет квадратичной, то есть $O$$( n^2 )$.

💡 Информация о степенях вершин графа находит применение в других графовых алгоритмах.

Например, если нужно найти гамильтонов цикл в заданном графе, то предварительно нужно доказать, что граф является гамильтоновым. Для этого стоит воспользоваться условием Оре или Поша. А эти алгоритмы ( условия ) оперируют степенями вершин.

➡ Пишите в комментариях, что непонятно в алгоритме определения степеней вершин неориентированного графа, а также в каких алгоритмах вам пригодилась эта «степенная» информация.


Материал подготовил Александр Георгиевич, специалист по динамическим структурам данных и графовым алгоритмам: стеки, деки, списки, деревья, хеш-таблицы, графы и т.п. Для записи на частную подготовку или заказа работы по программированию звонить по номеру телефона: 8(926) 610 — 61 — 95 (электронный адрес: proglabs@mail.ru).