экономических наук. Москва. 2011. с.18-19
11. Локтюхина Н.В. Социальное партнерство на рынке труда. Теоретические и прикладные аспекты. Москва. 2011. с. 19-39
12. Петров В.А. Развитие понятия рынка труда в современной экономике. Актуальные проблемы гуманитарных и естественных наук. 2015. №5 -1
13. Российский работник: образование, профессия, квалификация. Под ред. В.Е.Гимпельсона, Р.И.Капелюшникова. Москва. Изд. Дом ВШЭ. 2011.
14. Назарова У.А. Система «работодатель-наемный работник»: проблема гармонизации современных социально-трудовых отношений. Автореферат диссертации на соискание ученой степени доктора экономических наук. Москва, 2008., с.11
15. Новикова И.В. Регулирование занятости населения на Дальнем Востоке Российской Федерации. Монография. Москва. 2017. с.212-245
16. Сигова С.В. Государственное регулирование сбалансированности рынка труда в современной России. Автореферат диссертации на соискание ученой степени доктора экономических наук. Москва. 2011.
УДК 608.2
Пронина Е.А. студент магистратуры Лебединская А. А. студент магистратуры Шурхаленко П. Г. студент магистратуры НИУ «БелГУ» Россия, г. Белгород КОМПЬЮТЕРНАЯ РЕАЛИЗАЦИЯ ПОИСКА В ГЛУБИНУ Аннотация: в данной статье рассмотрены особенности поиска решений в глубину, программно реализован данный метод.
Ключевые слова: поиск в глубину, программная реализация.
Pronina E.A. graduate student NRU "BelSU" Russia, Belgorod Lebedinskaya A.A. graduate student NRU "BelSU" Russia, Belgorod Shurkhalenko P. G. graduate student NRU "BelSU" Russia, Belgorod COMPUTER IMPLEMENTATION OF SEARCH INTO THE DEPTH Annotation: this article discusses the features of finding solutions in depth, this method is programmatically implemented. Keywords: dfs, software implementation.
Актуальность исследования объясняется тем, что в настоящее время, существует множество разработанных алгоритмов для решения различных задач из самых разных областей человеческой деятельности.
Очевидно, что наиболее понятный и полезный для человека способ представления графа — изображение графа на плоскости в виде точек и соединяющих их линий — будет совершенно бесполезным, если мы захотим решать с помощью ЭВМ задачи, связанные с графами. Алгоритм поиска (или обхода) в глубину позволяет построить обход ориентированного или неориентированного графа, при котором посещаются все вершины, доступные из начальной вершины.
Отличие поиска в глубину от поиска в ширину заключается в том, что результатом алгоритма поиска в глубину является некоторый маршрут, следуя которому можно обойти последовательно все вершины графа, доступные из начальной вершины. Этим он принципиально отличается от поиска в ширину, где одновременно обрабатывается множество вершин, в поиске в глубину в каждый момент исполнения алгоритма обрабатывается только одна вершина. С другой стороны, поиск в глубину не находит кратчайших путей, зато он применим в ситуациях, когда граф неизвестен целиком, а исследуется каким-то автоматизированным устройством.
Обход в глубину можно представить себе следующим образом. Пусть исследователь находится в некотором лабиринте (графе) и он хочет обойти весь лабиринт (посетить все доступные вершины в графе). Исследователь находится в некоторой вершине и видит ребра, исходящие из этой вершины.
Видим, что алгоритм является рекурсивным — для обхода всего графа нужно переместиться в соседнюю вершину, после чего повторить для этой вершины алгоритм обхода. Но возникает проблема зацикливания — если из вершины А можно перейти в вершину В, то из вершины В можно перейти в вершину А и рекурсия будет бесконечной. Для борьбы с рекурсией нужно применить очень простую идею — исследователь не должен идти в ту вершину, в которой он уже был раньше, то есть которая не представляет для него интерес (считаем, что интерес для исследователя представляют только вершины, в которых он не был ранее).
Поскольку целью обхода в глубину зачастую является построение дерева обхода в глубину, то сразу же будем хранить предшественника для каждой вершины.
Алгоритм обхода в глубину позволяет решать множество различных задач. Например, реализуем при помощи алгоритма обхода в глубину подсчет числа компонент связности в неориентированном графе.
Для этого будем обходить все вершины графа и проверять, была ли очередная вершина посещена ранее. Если не была - то это означает, что найдена новая компонента связности, для выделения всей компоненты связности необходимо запустить DFS от этой вершины.
Так же можно проверить граф на двудольность. Граф называется двудольным, если его вершины можно разбить на два множества так, что
концы каждого ребра принадлежат разным множествам. Иными словами, можно покрасить вершины графа в два цвета так, что концы каждого ребра покрашены в разный цвет.
Алгоритм DFS для каждого ребра будет проверять цвет конечной вершины этого ребра. Если вершина не была посещена, то она красится в цвет, неравный цвету текущей вершины. Если же вершина была посещена, то ребро либо пропускается, если его концы - разноцветные, а если его концы одного цвета, то делается пометка, что граф не является двудольным.
Можем осуществить поиск цикла в ориентированном графе. Цикл в ориентированном графе можно обнаружить по наличию ребра, ведущего из текущей вершины в вершину, которая в настоящий момент находится в стадии обработки, то есть алгоритм DFS зашел в такую вершину, но еще не вышел из нее. В таком алгоритме DFS будем красить вершины в три цвета. Цветом 0 («белый») будем обозначать еще непосещенные вершины. Цветом 1 («серый») будем обозначать вершины в процессе обработки, а цветом 2 («черный») будем обозначать уже обработанные вершины. Вершина красится в цвет 1 при заходе в эту вершину и в цвет 2 - при выходе. Цикл в графе существует, если алгоритм DFS обнаруживает ребро, конец которого покрашен в цвет 1.
Еще одно важное применение поиска в глубину - топологическая сортировка. Пусть дан ориентированный граф не содержащий циклов. Тогда вершины этого графа можно упорядочить так, что все ребра будут идти от вершин с меньшим номером к вершинам с большим номером. Для топологической сортировки графа достаточно запустить алгоритм DFS, при выходе из вершины добавляя вершину в конец списка с ответом. После окончания алгоритма список с ответом развернуть в противоположном порядке.
Поиск мостов. Мостом называется ребро, при удалении которого граф распадается на две компоненты связности. Алгоритм поиска в глубину позволяет найти все мосты в связном графе за один DFS, то есть за сложность О(п).
Программа, выполняющая действия над матрицами, реализована с помощью динамических массивов (так как есть необходимость задавать матрицы произвольной размерности) и функций. Использование функций в программе наглядно показано на блок - схеме.
В разобранном здесь примере совершается обход в глубину графа, представленного на рисунке ниже.
(о) (Т) (г
(Лл (Лл О*
(л)—
Рисунок 1 - Обход графа в глубину
Обход графа в глубину описывается следующим алгоритмом: выбрать из непройденных вершин вершину с наименьшим номером; пройти выбранную вершину и отметить её в массиве пометок как пройденную; просмотреть список инцидентности только что пройденной вершины и к каждой непройденной вершине из списка применить рекурсивно пункты 2 и 3 данного алгоритма; перейти к пункту 1.
Чтобы на экран выводился весь маршрут обхода, начиная с первой вершины, следует ввести значение переменной from (стартовая точка), на единицу меньшее номера первой вершины._
lOOOOOOOOOOOOO 01100000000000 00011000000000 00010100000000 11000010000000 00001001000000 00100000100000 00000100011000 OOOOOOOOOOOlOO 00000010000110 00000001010011 00000000101001
Рисунок 2 - Матрица инцидентности
10 0 0 0 0 0 0 0 0 0 0 0 0
0 11 0 0 0 0 0 0 0 0 0 0 0
ООО 1 1 0 0 0 0 0 0 0 0 0
ООО 1 0 1 0 0 0 0 0 0 0 0
110 0 0 0 1 0 0 0 0 0 0 0
ООО 0 1 0 0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0 1 0 0 0 0 0
ООО 0 0 1 0 0 0 1 1 0 0 0
ООО 0 0 0 0 0 0 0 0 1 0 0
ООО 0 0 0 1 0 0 0 0 1 1 0
ООО 0 0 0 0 1 0 1 0 0 1 1
ООО 0 0 0 0 0 1 0 1 0 0 1
From » '. 55
)rder:
) 4 1 1 б : LI 7 3 2 5 10 ! Э 8
...Program finished wi th exit code 0
press ENTER to exit console.Q
Рисунок 3 - Последовательность вершин при вводной 55 Данный алгоритм был реализован на языке программирования C++ ,а затем проверен на наличие ошибок. Мы осуществили ручной просчет, чтобы убедится в правильности работы нашей программы. Основными структурами, при создании программы являлись: динамические массивы и циклы^Ы1е , for), а так же функции.
Использованные источники:
1. Гладков Л.А. Дискретная математика / Курейчик В.В., Курейчик В.М. М.: Физматлит 2014 - 496с
2. Федорова, Е.Н. Теоретические основы программирования: учебное пособие. / Е. Н. Федорова. - МГИУ, 2012.-214 с.