Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Алгоритм обхода графов в ширинуСодержание книги Похожие статьи вашей тематики
Поиск на нашем сайте
Пусть задан граф G = (V, Е) и выделена исходная (source) вершина s. Алгоритм поиска в ширину систематически обходит все ребра G для "открытия" всех вершин, достижимых из s, вычисляя при этом расстояние (минимальное количество ребер) до каждой достижимой из s вершины. Кроме того, в процессе обхода строится "дерево поиска в ширину" с корнем s, содержащее все достижимые вершины. Для каждой достижимой из s вершины v путь в дереве поиска в ширину соответствует кратчайшему (т.е. содержащему наименьшее количество ребер) пути от s до v в G. Алгоритм работает как для ориентированных, так и для неориентированных графов. BFS(G,s) { for each u in V { // initialization color [u] = white d [u] = infinity red[u] = null } color [s] = gray // initialize source s d[s] = 0 Q = {s} // put s in the queue while (Q is nonempty) { u = Q.Dequeue() // u is the next to visit for each v in Adj[u] { if (color[v] == white) { //if neighbor v undiscovered color[v] = gray //...mark it discovered d[v] = d[u]+l //...set its distance pred[v] = u //...and its predecessor Q.Enqueue(v) //...put it in the queue } } color [u] = black // we are done with u } } Алгоритм обхода графов в глубину Стратегия поиска в глубину, чтобы идти "вглубь" графа, насколько это возможно. При выполнении поиска в глубину исследуются все ребра, выходящие из вершины, открытой последней, и покидает вершину, только когда не остается неисследованных ребер — при этом происходит возврат в вершину, из которой была открыта вершина v. Этот процесс продолжается до тех пор, пока не будут открыты все вершины, достижимые из исходной. Если при этом остаются неоткрытые вершины, то одна из них выбирается в качестве новой исходной вершины и поиск повторяется уже из нее. Этот процесс повторяется до тех пор, пока не будут открыты все вершины. DFS(G) { // main program for each u in V { // initialization color[u] = white; pred[u] = null; } time = 0; for each u in V if (color[u] == white) // found an undiscovered vertex DFSVisit(u); // start a new search here } DFSVisit(u) { // start a search at u color[u] = gray; // mark u visited d[u] = ++time; for each v in Adj(u) do if (color[v] == white) { pred[v] = u; //...set predecessor pointer DFSVisit(v); //...visit v } color[u] = black; // we're done with u f[u] = ++time; }
Остовое дерево, классификация ребер, топологическая сортировка. Дан взвешенный неориентированный граф G с n вершинами и m рёбрами. Требуется найти такое поддерево этого графа, которое бы соединяло все его вершины, и при этом обладало наименьшим возможным весом (т.е. суммой весов рёбер). Поддерево — это набор рёбер, соединяющих все вершины, причём из любой вершины можно добраться до любой другой ровно одним простым путём. Такое поддерево называется минимальным остовным деревом или просто минимальным остовом. Любой остов будет содержать n-1 ребро. Остовое дерево - ацикличный подграф G1 = (V 1,E 1) графа G = (V,E), где E1 Í E,V 1 = V, Минимальное остовое дерево - остовое дерево с минимальным весом. В естественной постановке эта задача звучит следующим образом: есть n городов, и для каждой пары известна стоимость соединения их дорогой (либо известно, что соединить их нельзя). Требуется соединить все города так, чтобы можно было доехать из любого города в другой, а при этом стоимость прокладки дорог была бы минимальной. Проблема построения сети Области возникновения: коммуникационные и дорожные сети. Дано: множество узлов сети (хосты, города). Необходимо: построение сети с наименьшим общим весом ребер (длина сетевых кабелей, длина дорог). Графовая модель: узлы сети являются узлами графа, E = V2, нам известны веса всех ребер. Результат: свободное дерево. Подход к поиску МОД Строим дерево A путем добавления по одному ребру, и перед каждой итерацией текущее дерево является подмножеством некоторого МОД. На каждом шаге алгоритма мы определяем ребро (u, v), которое можно добавить к А без нарушения этого свойства. Мы назовем такое ребро безопасным
GenericMST(G, w) 1 A ← 0 2 while A не является МОД 3 do Найти безопасное для A ребро (u, v) 4 A ← A U {(u, v)} 5 return A ____________________________________________________________________________ Классификация ребер 1. Ребра деревьев (tree edges) — это ребра графа G. Ребро (u, v) является ребром дерева, если при исследовании этого ребра открыта вершина v. 2. Обратные ребра (back edges) — это ребра (u,v), соединяющие вершину u с ее предком v в дереве поиска в глубину. Ребра-циклы, которые могут встречаться в ориентированных графах, рассматриваются как обратные ребра. 3. Прямые ребра (forward edges) — это ребра (u,v), не являющиеся ребрами дерева и соединяющие вершину u с ее потомком v в дереве поиска в глубину. 4. Перекрестные ребра (cross edges) — все остальные ребра графа. Они могут соединять вершины одного и того же дерева поиска в глубину, когда ни одна из вершин не является предком другой, или соединять вершины в разных деревьях. Алгоритм DFS можно модифицировать так, что он будет классифицировать встречающиеся при работе ребра. Ключевая идея заключается в том, что каждое ребро (u, v) можно классифицировать при помощи цвета вершины v при пер- первом его исследовании (правда, при этом не различаются прямые и перекрестные ребра).
Первый случай следует непосредственно из определения алгоритма. Рассматривая второй случай, заметим, что серые вершины всегда образуют линейную цепочку потомков, соответствующую стеку активных вызовов процедуры DFS_Visit; количество серых вершин на единицу больше глубины последней открытой вершины в дереве поиска в глубину. Исследование всегда начинается от самой глубокой серой вершины, так что ребро, которое достигает другой серой вершины, достигает предка исходной вершины. В третьем случае мы имеем дело с остальными ребрами, не подпадающими под первый или второй случай. Можно показать, что ребро (u, v) является прямым, если d [u] < d [v], и перекрестным, если d [u] > d [v] ___________________________________________________________________________ Топологическая сортировка В графе предшествования каждое ребро (u, v) означает, что u предшествует v Топологическая сортировка графа есть построение последовательности а, где для всех ai и aj выполняется $(аi,аj) Þ i < j. Топологическая сортировка (topological sort) ориентированного ациклического графа G = (V, Е) представляет собой такое линейное упорядочение всех его вершин, что если граф G содержит ребро (u,v) то u при таком упорядочении располагается до v (если граф не является ацикличным, такая сортировка невозможна). Топологическую сортировку графа можно рассматривать как такое упорядочение его вершин вдоль горизонтальной линии, что все ребра направлены слева направо.
Отсортированная последовательность: C2, C6, C7, C1, C3, C4, C5, C8 TopSort(G) { for each(u in V) color[u] = white; // initialize L = new linked_list; // L is an empty linked list for each (u in V) if (color[u] == white) TopVisit(u); return L; // L gives final order } TopVisit(u) { // start a search at u color[u] = gray; // mark u visited for each (v in Adj(u)) if (color[v] == white) TopVisit(v); Append u to the front of L; // on finishing u add to list } T (n) = Θ(V + E)
|
||||
Последнее изменение этой страницы: 2016-09-20; просмотров: 535; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.117.91.170 (0.01 с.) |