Ребра графа

Чтобы найти вид ребер графа, на котором мы применили алгоритм поиска в глубину, мы могли бы использовать это:

ребра дерева: x -> y, когда [d[y],f[y]] ⊂ [d[x],f[x]]

передние ребра: x -> y, когда [d[x],f[x]] ⊂ [d[y],f[y]]

задние ребра: x -> y, когда [d[y],f[y]] ⊂ [d[x],f[x]]

Перекрестные ребра: x -> y, когда [d[x],f[x]] ∩ [d[y],f[y]]=∅

Время обнаружения: время обнаружения d[v] – это количество узлов, обнаруженных или завершенных до того, как впервые появится v.

Время окончания: время окончания f[v] – это количество узлов, обнаруженных или завершенных до завершения расширения $v$.

Вот график, на который я смотрю:

введите здесь описание изображения

И вот время открытия и окончания, которое я нашел:

введите здесь описание изображения

Алгоритм:

Depthfirstsearch(G)
   for each v ∈ V
        color[v]=white
        p[v]=NIL
   time=0
   for each v ∈ V
       if color[v]=white then
          Visit(v)


Visit(u)
  color[u]=gray
  time=time+1
  d[u]=time
  for each v ∈ Adj[u]
       if color[v]=white then
          p[v]=u
          Visit(v)
  color[u]=black
  time=time+1
  f[u]=time

Когда у нас есть, например, случай [d[y],f[y]] ⊂ [d[x],f[x]], как мы можем узнать, является ли это краем дерева или обратным краем?

Должны ли мы помечать родителя каждого узла, например:

введите здесь описание изображения

и если есть красное ребро, мы знаем, что это ребро дерева? Если да, то не могли бы вы объяснить мне, почему?

Кроме того, разве jh,ia не является передним краем, а ag — задним краем? Или я ошибаюсь?


person Mary Star    schedule 15.12.2014    source источник


Ответы (1)


Ваши отношения для переднего и заднего края неверны - вы должны поменять их местами.
Кроме того, я бы рекомендовал прочитать этот абзац из Википедии:
http://en.wikipedia.org/wiki/Depth-first_search#Output_of_a_depth-first_search
содержит более интуитивно понятное и простое определение этих краев и хорошее изображение: введите здесь описание изображения

Прямые ответы на ваши вопросы

Когда у нас есть, например, случай [d[y],f[y]] ⊂ [d[x],f[x]], как мы можем узнать, является ли это ребром дерева или вперед край?

Если ребро принадлежит дереву - оно является ребром дерева (и все ребра дерева удовлетворяют указанному выше отношению).
Если ребро не принадлежит дереву и оно удовлетворяет приведенному выше отношению - это передний край.

Должны ли мы помечать родителя каждого узла, например: [...] и если есть красное ребро, мы знаем, что это ребро дерева?

Да, однако мы должны помнить, что края дерева синие, а красные края — это просто представление дерева, и они указывают в другом направлении. Итак, если есть красная стрелка x -> y, значит, дереву принадлежит синяя стрелка y -> x (для вас это может быть очевидно). Вы также можете прочитать определение связующего дерева:
http://en.wikipedia.org/wiki/Spanning_tree#Definitions

Кроме того, разве jh,ia не является передним краем, а ag — задним краем? Или я ошибаюсь?

Все как раз наоборот: jh,ia — это задние ребра, а ag — переднее ребро (поскольку ваши отношения для заднего и переднего ребер неверны).

Более длинное объяснение

Когда вы запускаете DFS на графе, он создает представление связующего дерева этого графа, устанавливая p[v]=u в Visit(u) (что означает, что вершина u является родителем вершины v в связующем дереве входного графа).

Вы правильно нарисовали это изображение, используя красные стрелки. Однако на самом деле остовное дерево графа образует ребра этого графа (или, если быть точным, их подмножество). Итак, чтобы узнать, принадлежит ли синее x -> y ребро графа остовному дереву этого графа, нам нужно проверить, есть ли на вашем изображении y -> x красное ребро или, другими словами, является ли x родителем y (p[y] == x ) в связующем дереве.

Давайте выясним, почему jh является задним ребром. Нам нужно посмотреть на вашу вторую фотографию:

DFS

DFS начинается в a. После посещения вершин c,f,g он возвращается к a и впервые посещает d (что добавляет ребро a -> d к остовному дереву, которое строит DFS). Затем он посещает h,j и теперь хочет посетить h, но он уже был посещен, а h имеет меньшее время обнаружения, чем j, поэтому мы движемся назад — это задний край.

person MD-11    schedule 15.12.2014
comment
Понятно... Но не могли бы вы объяснить мне подробнее, почему если x является предком y, то ребро x-›y является ребром дерева? - person Mary Star; 16.12.2014
comment
Кроме того, в упражнении, которое я рассматриваю, меня просят показать, как поиск в глубину работает на графе. Итак, мне нужно написать команды, которые выполняются, или мне нужно просто написать в узлах время обнаружения и окончания и добавить красные стрелки на графике? - person Mary Star; 16.12.2014
comment
Я не уверен, понимаете ли вы, что такое дерево и связующее дерево в частности? Забудьте на мгновение о родителях и взгляните на 3-ю страницу этого pdf (там есть определение края дерева): cs.kau.se/cs/education/courses/dvgb03/lectures/graphs2.pdf В своем упражнении вам нужно нарисовать картинку, похожую на один я вставил из википедии - просто напишите время обнаружения для вершин и пометьте края как дерево/вперед/назад/крест. Если вы можете это нарисовать, это показывает, что вы знаете, как работает DFS. - person MD-11; 16.12.2014
comment
Не могли бы вы также взглянуть на это? stackoverflow.com/questions/28005030/ - person Mary Star; 18.01.2015