HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Статья расскажет о базовых понятиях теории графов, а также о некоторых известных алгоритмах графов. Отдельное внимание будет уделено алгоритмической последовательности Дейкстры (Dijkstra's algorithm).</p>
1 <p>Статья расскажет о базовых понятиях теории графов, а также о некоторых известных алгоритмах графов. Отдельное внимание будет уделено алгоритмической последовательности Дейкстры (Dijkstra's algorithm).</p>
2 <h2>Из теории</h2>
2 <h2>Из теории</h2>
3 <p>Граф представляет собой абстрактный объект из множества вершин (узлов) и набора ребер - связей между парами вершин. Эта тема чрезвычайно обширна - в той же Википедии соответствующей терминологии уделена целая страница. Более точное определение можно получить в дискретной математике, где изучают графы (их появлению способствовали работы Эйлера).</p>
3 <p>Граф представляет собой абстрактный объект из множества вершин (узлов) и набора ребер - связей между парами вершин. Эта тема чрезвычайно обширна - в той же Википедии соответствующей терминологии уделена целая страница. Более точное определение можно получить в дискретной математике, где изучают графы (их появлению способствовали работы Эйлера).</p>
4 <p>На практике графы используются при описании сложно структурированных данных, поэтому можно говорить об их большом прикладном значении. Их можно встретить в следующих случаях: - в моделях глобальной либо локальной сети; - в генеалогических древах; - в алгоритмических блок-схемах; - в схемах метро; - в принципиальных электрических схемах; - в ментальных картах; - в моделях связи в БД и во многих других случаях.</p>
4 <p>На практике графы используются при описании сложно структурированных данных, поэтому можно говорить об их большом прикладном значении. Их можно встретить в следующих случаях: - в моделях глобальной либо локальной сети; - в генеалогических древах; - в алгоритмических блок-схемах; - в схемах метро; - в принципиальных электрических схемах; - в ментальных картах; - в моделях связи в БД и во многих других случаях.</p>
5 <p>Для примера рассмотрим<strong>неориентированный граф</strong>G. Он представляет собой упорядоченную пару G:=(V, E), где:</p>
5 <p>Для примера рассмотрим<strong>неориентированный граф</strong>G. Он представляет собой упорядоченную пару G:=(V, E), где:</p>
6 <ul><li>E - множество пар вершин (ребер);</li>
6 <ul><li>E - множество пар вершин (ребер);</li>
7 <li>V - непустое множество вершин (узлов).</li>
7 <li>V - непустое множество вершин (узлов).</li>
8 </ul><p>Ребра и узлы графа - это его элементы, количество узлов называют порядком, а количество ребер - размером.</p>
8 </ul><p>Ребра и узлы графа - это его элементы, количество узлов называют порядком, а количество ребер - размером.</p>
9 <p>На рисунке ниже представлен связный ацикличный граф - дерево:</p>
9 <p>На рисунке ниже представлен связный ацикличный граф - дерево:</p>
10 <h2>Словарь терминов</h2>
10 <h2>Словарь терминов</h2>
11 <p>В таблице ниже представлена выборка основных терминов из теории алгоритмов графов:</p>
11 <p>В таблице ниже представлена выборка основных терминов из теории алгоритмов графов:</p>
12 <p>Следует рассмотреть главные понятия: 1.<strong>Маршрут</strong>- конечная последовательность узлов, где каждый узел за исключением последнего соединяется со следующим с помощью ребра. 2.<strong>Цепь</strong>- маршрут, не имеющий повторяющихся рёбер. Простая цепь - маршрут без повторяющихся узлов. 3.<strong>Ориентированный маршрут</strong>(путь) в орграфе - конечная последовательность дуг и узлов, где каждый элемент инцидентен как предыдущему, так и последующему. 4.<strong>Длина пути</strong>(цикла) - количество ребер, составляющих этот путь. 5.<strong>Цикл</strong>(путь)- цепь, где совпадают первый и последний узел. Путь простой, если ребра не повторяются, а также элементарный, если является простым, и не повторяются узлы. 6. Матрица смежности, матрица инцидентности, список смежности, список ребер - методы представления графов.</p>
12 <p>Следует рассмотреть главные понятия: 1.<strong>Маршрут</strong>- конечная последовательность узлов, где каждый узел за исключением последнего соединяется со следующим с помощью ребра. 2.<strong>Цепь</strong>- маршрут, не имеющий повторяющихся рёбер. Простая цепь - маршрут без повторяющихся узлов. 3.<strong>Ориентированный маршрут</strong>(путь) в орграфе - конечная последовательность дуг и узлов, где каждый элемент инцидентен как предыдущему, так и последующему. 4.<strong>Длина пути</strong>(цикла) - количество ребер, составляющих этот путь. 5.<strong>Цикл</strong>(путь)- цепь, где совпадают первый и последний узел. Путь простой, если ребра не повторяются, а также элементарный, если является простым, и не повторяются узлы. 6. Матрица смежности, матрица инцидентности, список смежности, список ребер - методы представления графов.</p>
13 <h4>Виды графов:</h4>
13 <h4>Виды графов:</h4>
14 <ol><li>Ориентированный - (орграф) - рёбрам присвоено направление.</li>
14 <ol><li>Ориентированный - (орграф) - рёбрам присвоено направление.</li>
15 <li>Неориентированный - пара узлов упорядоченной не является.</li>
15 <li>Неориентированный - пара узлов упорядоченной не является.</li>
16 <li>Связный - между любой парой узлов есть хотя бы один путь.</li>
16 <li>Связный - между любой парой узлов есть хотя бы один путь.</li>
17 <li>Дерево - связный ациклический граф (нет циклов, между парами вершин есть лишь по одному пути). Здесь корень дерева - это узел, имеющий нулевую степень захода, а листья - узел с нулевой степень исхода.</li>
17 <li>Дерево - связный ациклический граф (нет циклов, между парами вершин есть лишь по одному пути). Здесь корень дерева - это узел, имеющий нулевую степень захода, а листья - узел с нулевой степень исхода.</li>
18 <li>Взвешенный - каждому ребру поставлено в соответствие определенное число - вес ребра.</li>
18 <li>Взвешенный - каждому ребру поставлено в соответствие определенное число - вес ребра.</li>
19 </ol><h2>Ищем кратчайший путь в графе. Алгоритм Дейкстры</h2>
19 </ol><h2>Ищем кратчайший путь в графе. Алгоритм Дейкстры</h2>
20 <p>Хорошо известен алгоритм графов, который был изобретён в 1959 году учёным Эдсгером Дейкстрой (Нидерланды). Он позволяет находить кратчайшие пути от одной из вершин до всех остальных. Сегодня алгоритм графов, который создал известный ученый Дейкстра, часто применяется в программировании и других технологиях - в тех же протоколах маршрутизации. В этом алгоритме графов дан взвешенный орграф G(V, E), не имеющий дуг отрицательного веса. Надо найти кратчайшие пути от какой-либо вершины a графа G до остальных узлов.</p>
20 <p>Хорошо известен алгоритм графов, который был изобретён в 1959 году учёным Эдсгером Дейкстрой (Нидерланды). Он позволяет находить кратчайшие пути от одной из вершин до всех остальных. Сегодня алгоритм графов, который создал известный ученый Дейкстра, часто применяется в программировании и других технологиях - в тех же протоколах маршрутизации. В этом алгоритме графов дан взвешенный орграф G(V, E), не имеющий дуг отрицательного веса. Надо найти кратчайшие пути от какой-либо вершины a графа G до остальных узлов.</p>
21 <p>Идея алгоритма графов следующая: надо определить массив D[], где для любой вершины v будет храниться текущая длина D[v] кратчайшего пути из s в v. Изначально D[s]=0, причем для всех остальных узлов данная длина равна бесконечности (речь идет о некотором значении, которое заведомо больше возможной длины пути).</p>
21 <p>Идея алгоритма графов следующая: надо определить массив D[], где для любой вершины v будет храниться текущая длина D[v] кратчайшего пути из s в v. Изначально D[s]=0, причем для всех остальных узлов данная длина равна бесконечности (речь идет о некотором значении, которое заведомо больше возможной длины пути).</p>
22 <p>Также для каждой вершины мы сохраняем v, несмотря на то, помечена она либо ещё нет, то есть определяется булевский массив U[]. Поначалу все узлы не помечены, поэтому первоначальное значение элементов массива - false. Сам дейкстровский алгоритм состоит из n итераций (по числу узлов), а на очередной итерации выбирают вершину v с самой маленькой величиной D[v] среди тех, которые ещё не помечены.</p>
22 <p>Также для каждой вершины мы сохраняем v, несмотря на то, помечена она либо ещё нет, то есть определяется булевский массив U[]. Поначалу все узлы не помечены, поэтому первоначальное значение элементов массива - false. Сам дейкстровский алгоритм состоит из n итераций (по числу узлов), а на очередной итерации выбирают вершину v с самой маленькой величиной D[v] среди тех, которые ещё не помечены.</p>
23 <p>Выбранная вершина v отмечается помеченной, после чего на текущей итерации из узла v выполняются релаксации - просматриваются все ребра (v, to), которые исходят из вершины v, причем для каждого узла to алгоритм пробует улучшить значение D[to].</p>
23 <p>Выбранная вершина v отмечается помеченной, после чего на текущей итерации из узла v выполняются релаксации - просматриваются все ребра (v, to), которые исходят из вершины v, причем для каждого узла to алгоритм пробует улучшить значение D[to].</p>
24 <p>Если длина текущего ребра = len, то в коде релаксация будет выглядеть следующим образом:</p>
24 <p>Если длина текущего ребра = len, то в коде релаксация будет выглядеть следующим образом:</p>
25 <p>В конечном итоге после n итераций, все узлы станут помеченными, а алгоритм закончит работу.</p>
25 <p>В конечном итоге после n итераций, все узлы станут помеченными, а алгоритм закончит работу.</p>
26 <p>Если же не все вершины являются достижимыми из вершины s, тогда значения D[v] так и останутся для них бесконечными. В результате несколько последних итераций алгоритма станут как раз выбирать эти вершины, однако выполнять полезной работы эти итерации не станут (бесконечное расстояние не способно прорелаксировать другие). То есть алгоритм можно сразу останавливать, делая это в тот момент, когда в качестве выбранной вершины будет браться вершина, имеющая бесконечное расстояние.</p>
26 <p>Если же не все вершины являются достижимыми из вершины s, тогда значения D[v] так и останутся для них бесконечными. В результате несколько последних итераций алгоритма станут как раз выбирать эти вершины, однако выполнять полезной работы эти итерации не станут (бесконечное расстояние не способно прорелаксировать другие). То есть алгоритм можно сразу останавливать, делая это в тот момент, когда в качестве выбранной вершины будет браться вершина, имеющая бесконечное расстояние.</p>
27 <p>На рисунке ниже - взвешенный граф, иллюстрирующий работу этого алгоритма графов в программе на C++:</p>
27 <p>На рисунке ниже - взвешенный граф, иллюстрирующий работу этого алгоритма графов в программе на C++:</p>
28 <p>А вот и сам код программы:</p>
28 <p>А вот и сам код программы:</p>
29 <h2>Вместо заключения</h2>
29 <h2>Вместо заключения</h2>
30 <p>Ниже будут представлены еще два популярных алгоритма обхода графа - поиск в глубину и поиск в ширину.</p>
30 <p>Ниже будут представлены еще два популярных алгоритма обхода графа - поиск в глубину и поиск в ширину.</p>
31 <h4>Поиск в глубину</h4>
31 <h4>Поиск в глубину</h4>
32 <p>Из названия понятно, что в процессе обхода графа мы идем "вглубь", насколько это возможно. Так удастся последовательно обойти все вершины, доступные из начальной. Когда ребро приведет в непройденную вершину, алгоритм запустится с нее. Если ребер, ведущих в нерассмотренную вершину, больше не будет, произойдет возврат назад.</p>
32 <p>Из названия понятно, что в процессе обхода графа мы идем "вглубь", насколько это возможно. Так удастся последовательно обойти все вершины, доступные из начальной. Когда ребро приведет в непройденную вершину, алгоритм запустится с нее. Если ребер, ведущих в нерассмотренную вершину, больше не будет, произойдет возврат назад.</p>
33 <h4>Поиск в ширину</h4>
33 <h4>Поиск в ширину</h4>
34 <p>Этот алгоритм позволит найти кратчайший путь из одной вершины до остальных. Сначала посещаются все вершины, которые смежны с текущей, далее - их потомки.</p>
34 <p>Этот алгоритм позволит найти кратчайший путь из одной вершины до остальных. Сначала посещаются все вершины, которые смежны с текущей, далее - их потомки.</p>
35 <p>Также существуют алгоритмы Форда, Косарайю, Тарьяна и другие.</p>
35 <p>Также существуют алгоритмы Форда, Косарайю, Тарьяна и другие.</p>
36 <p><em>Источники:</em>• http://inf-w.ru/?page_id=7359; • https://proglib.io/p/graphs-algoguide/.</p>
36 <p><em>Источники:</em>• http://inf-w.ru/?page_id=7359; • https://proglib.io/p/graphs-algoguide/.</p>
37  
37