Différence entre les bords croisés et les bords avant dans un DFT

11

Dans un premier arbre de profondeur, il y a les bords qui définissent l'arbre (c'est-à-dire les bords qui ont été utilisés dans la traversée).

Il y a des bords restants reliant certains des autres nœuds. Quelle est la différence entre un bord transversal et un bord avant?

De wikipedia:

Sur la base de cet arbre couvrant, les bords du graphique d'origine peuvent être divisés en trois classes: les bords avant, qui pointent d'un nœud de l'arbre vers l'un de ses descendants, les bords arrière, qui pointent d'un nœud vers l'un de ses ancêtres, et les bords croisés, qui ne font ni l'un ni l'autre. Parfois, les bords des arbres, les bords qui appartiennent à l'arbre couvrant lui-même, sont classés séparément des bords avant. Si le graphique d'origine n'est pas orienté, tous ses bords sont des bords d'arbre ou des bords arrière.

Un bord qui n'est pas utilisé dans la traversée qui pointe d'un nœud à un autre n'établit-il pas une relation parent-enfant?

soandos
la source
Connexes: cs.stackexchange.com/questions/99988/… cherche à établir un algorithme qui, pour le graphique dirigé, préférera faire des bords avant, plutôt que des bords croisés, lors de la recherche en profondeur d'abord.
pfalcon

Réponses:

23

Wikipédia a la réponse:

entrez la description de l'image ici

Tous les types de bords apparaissent sur cette image. Tracez DFS sur ce graphique (les nœuds sont explorés dans l'ordre numérique) et voyez où votre intuition échoue.


Cela expliquera le schéma: -

Bord avant: (u, v), où v est un descendant de u, mais pas un bord d'arbre. Il s'agit d'un bord non arborescent qui relie un sommet à un descendant dans un arbre DFS.

Bord transversal: tout autre bord. Peut aller entre les sommets dans le même arbre de profondeur d'abord ou dans différents arbres de profondeur d'abord. (profane)
Il s'agit de n'importe quelle autre arête du graphe G. Il relie des sommets dans deux arbres DFS différents ou deux sommets dans le même arbre DFS dont aucun n'est l'ancêtre de l'autre. (formel)

Yuval Filmus
la source
Pourquoi n'est-il pas impossible que 6 ait été traversé en premier (côté droit en premier)? Si cela s'était produit, comment aurait-on appelé le bord 2-> 3?
soandos
@soandos, je vous suggère de prendre le temps de tracer vous-même l'algorithme. En supposant que les Wikipédiens n'ont pas fait d'erreur, l'image décrit une exécution authentique de DFS sur ce graphique, et il existe donc un moyen d'intégrer l'algorithme dans cette trace. Les types de bords sont décrits assez clairement dans Wikipedia, et vous pouvez également consulter cet exemple.
Yuval Filmus
Je comprends que c'est une façon valide de faire un DFS. Je demande simplement si cela a été fait dans l'autre sens.
soandos
Les résultats seraient alors différents. Je suis désolé, vous devrez vous débrouiller tout seul.
Yuval Filmus
2
@soandos En général, il peut très bien y avoir plusieurs traversées DFS. Les notions utilisées ici sont relatives à un parcours donné et diffèrent pour plusieurs parcours.
Raphael
9

Une traversée DFS dans un graphe non orienté ne laissera pas de bord transversal, car tous les bords incidents sur un sommet sont explorés.

Cependant, dans un graphique dirigé, vous pouvez rencontrer une arête qui mène à un sommet qui a été découvert auparavant de telle sorte que ce sommet n'est pas un ancêtre ou un descendant du sommet actuel. Une telle arête est appelée arête transversale.

Apoorv Gupta
la source
Aporov, Merci pour la réponse. Il me semble toujours que lorsque vous arrivez au sommet 6 dans le DFS tel que schématisé dans Wikipedia, vous avez trois arêtes à parcourir à partir de 6. À ce stade, le sommet 6 est "actuel". Finalement, vous allez traverser le bord jusqu'au sommet 3. Alors que 3 a déjà été visité, néanmoins puisqu'il y a un bord de 6 à 3, alors 3 est un descendant du sommet "actuel" 6. Si tel est le cas, il viole la définition d'un bord transversal. Il doit y avoir quelque chose de plus dans la définition qui n'est pas rendu très explicite.
En fait, DFS ne contient que des bords d'arbre pour les bords arrière (introduction aux algorithmes Thm. 22.10).
jrhee17
2

Dans une traversée DFS, les nœuds sont terminés une fois que tous leurs enfants sont terminés. Si vous marquez les heures de découverte et de fin pour chaque nœud pendant la traversée, vous pouvez vérifier si un nœud est un descendant en comparant les heures de début et de fin. En fait, toute traversée DFS partitionne ses bords selon la règle suivante.

Soit d [nœud] l'heure de découverte du nœud, de même f [nœud] l'heure de fin.

Théorème des parenthèses Pour tout u, v, exactement l'une des conditions suivantes:
1. d [u] <f [u] <d [v] <f [v] ou d [v] <f [v] <d [u ] <f [u] et aucun de u et v n'est un descendant de l'autre.

  1. d [u] <d [v] <f [v] <f [u] et v est un descendant de u.

  2. d [v] <d [u] <f [u] <f [v] et u est un descendant de v.

Donc, d [u] <d [v] <f [u] <f [v] ne peut pas se produire.
Comme les parenthèses: () [], ([]) et [()] sont OK mais ([)] et [(]) ne sont pas OK.

Par exemple, considérons le graphique avec des bords:
A -> B
A -> C
B -> C

Soit l'ordre de visite représenté par une chaîne d'étiquettes de nœuds, où "ABCCBA" signifie A -> B -> C (terminé) B (terminé) A (terminé), semblable à ((())).

Donc "ACCBBA" pourrait être un modèle pour "(() ())".

Exemples:
"CCABBA": Alors A -> C est un bord transversal, puisque le CC n'est pas à l'intérieur de A.
"ABCCBA": Alors A -> C est un bord avant (descendant indirect).
"ACCBBA": Alors A -> C est un bord d'arbre (descendant direct).

Sources:
CLRS:
https://mitpress.mit.edu/books/introduction-algorithms
Lecure Notes http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/GraphAlgor/depthSearch.htm

Chris Hafley
la source