- •Представление графа в программе.
- •Алгоритмы над графами
- •Обход графа в ширину
- •If(вершина v1 "новая"){
- •Поиск кратчайших путей.(Алгоритм Дейкстры).(wikipedia)
- •Алгоритм Прима
- •Алгоритм Краскала
- •Представление ориентированных графов
- •Атд для ориентированных графов
- •Задача нахождения кратчайшего пути
- •Остовные деревья минимальной стоимости
- •Обход графов
- •Поиск в ширину
- •Поиск в глубину
- •2. Матрица инцидентности
Алгоритмы над графами
Обход графа в глубину
Пусть задан граф G = (V,E), где V — множество вершин графа, E — множество ребер графа. Предположим, что в начальный момент времени все вершины графа окрашены в белый цвет. Выполним следующие действия:
Из множества всех белых вершин выберем любую вершину, обозначим её v1.
Выполняем для неё процедуру DFS(v1).
Перекрашиваем её в чёрный цвет.
Повторяем шаги 1-3 до тех пор, пока множество белых вершин не пусто.
Процедура DFS
(параметр — вершина
)
Перекрашиваем вершину u в серый цвет.
Для всякой вершины w, смежной с вершиной u, выполняем следующие два шага:
Если вершина w окрашена в белый цвет, выполняем процедуру DFS(w).
Окрашиваем w в чёрный цвет.
Обход графа в ширину
Работа всякого алгоритма обхода состоит в последовательном посещении вершин и исследовании ребер. Какие именно действия выполняются при посещении вершины и исследовании ребра - зависит от конкретной задачи, для решения которой производится обход. В любом случае, однако, факт посещения вершины запоминается, так что с момента посещения и до конца работы алгоритма она считается посещенной. Вершину, которая еще не посещена, будем называть новой. В результате посещения вершина становится открытой и остается такой, пока не будут исследованы все инцидентные ей ребра. После этого она превращается в закрытую.
Идея поиска в ширину состоит в том, чтобы посещать вершины в порядке их удаленности от некоторой заранее выбранной или указанной стартовой вершины α. Иначе говоря, сначала посещается сама вершина α, затем все вершины, смежные с α, то есть находящиеся от нее на расстоянии 1, затем вершины, находящиеся от α на расстоянии 2, и т.д.
Основная особенность поиска в ширину, отличающая его от других способов обхода графов, состоит в том, что в качестве активной вершины выбирается та из открытых, которая была посещена раньше других. Именно этим обеспечивается главное свойство поиска в ширину: чем ближе вершина к старту, тем раньше она будет посещена. Для реализации такого правила выбора активной вершины удобно использовать для хранения множества открытых вершин очередь - когда новая вершина становится открытой, она добавляется в конец очереди, а активная выбирается в ее начале. Схематически процесс изменения статуса вершин изображен на рисунке. Черным кружком обозначена активная вершина.
Алгоритм обхода приведён ниже:
создадим пустую очередь открытых вершин;
пометим все вершины как "новые";
вершина Start помещается в очередь и помечается как открытая;
while(очередь не пуста) {
v=вершина в начале очереди;
для всех вершин, смежных с v {
v1=очередная вершина, смежная с v;
If(вершина v1 "новая"){
поместим её в очередь и пометим как открытую;
запомним ребро (v,v1) в массиве пройденных ребер
} // конец прохода вершин смежных с v
вершина v становится закрытой и удаляется из очереди;
занесем вершину v в массив посещенных вершин;
} // конец цикла "пока очередь не пуста"
Если компонента связности единственная в графе, то пройденные ребра образуют остовное дерево.
Если граф состоит из более чем одной компоненты связности, то следует повторить процесс для каждой стартовой вершины, оставшейся “новой” после предыдущего прохода алгоритма. В результате будет получен остовный лес.
