Differenza tra bordi trasversali e bordi anteriori in un DFT


11

In un primo albero di profondità, ci sono i bordi che definiscono l'albero (cioè i bordi che sono stati usati nella traversata).

Ci sono alcuni bordi rimanenti che collegano alcuni degli altri nodi. Qual è la differenza tra un bordo trasversale e un bordo anteriore?

Da Wikipedia:

Sulla base di questo spanning tree, i bordi del grafico originale possono essere suddivisi in tre classi: bordi anteriori, che puntano da un nodo dell'albero a uno dei suoi discendenti, bordi posteriori, che puntano da un nodo a uno dei suoi antenati, e bordi incrociati, che non fanno nessuno dei due. A volte i bordi degli alberi, bordi che appartengono all'albero di spanning stesso, sono classificati separatamente dai bordi in avanti. Se il grafico originale non viene reindirizzato, tutti i suoi bordi sono bordi dell'albero o bordi posteriori.

Un bordo non utilizzato nell'attraversamento che punta da un nodo all'altro stabilisce una relazione genitore-figlio?


Correlati: cs.stackexchange.com/questions/99988/… cerca di stabilire un algoritmo che, per il grafico diretto, preferirà fare bordi in avanti, anziché bordi incrociati, durante la ricerca in profondità.
falco

Risposte:


23

Wikipedia ha la risposta:

inserisci qui la descrizione dell'immagine

Tutti i tipi di bordi appaiono in questa immagine. Traccia DFS su questo grafico (i nodi sono esplorati in ordine numerico) e vedi dove il tuo intuito fallisce.


Questo spiegherà il diagramma: -

Margine anteriore: (u, v), dove v è un discendente di u, ma non un bordo dell'albero. È un bordo non dell'albero che collega un vertice a un discendente in un albero DFS.

Bordo trasversale: qualsiasi altro bordo. Può andare tra i vertici nello stesso primo albero di profondità o in diversi primi alberi di profondità. (laico)
È qualsiasi altro bordo nel grafico G. Collega i vertici in due diversi alberi DFS o due vertici nello stesso albero DFS, nessuno dei quali è l'antenato dell'altro. (formale)


Perché non è impossibile attraversare per primo 6 (prima il lato destro)? Se ciò fosse accaduto, come sarebbe stato chiamato il bordo 2-> 3?
soandos

@soandos, ti suggerisco di prenderti il ​​tempo per rintracciare l'algoritmo. Supponendo che i Wikipediani non abbiano commesso un errore, l'immagine descrive una buona sequenza di DFS su questo grafico, e quindi c'è un modo per adattare l'algoritmo a questa traccia. I tipi di bordi sono descritti abbastanza chiaramente in Wikipedia e puoi anche consultare questo esempio.
Yuval Filmus

Capisco che questo è un modo valido di fare un DFS. Sto semplicemente chiedendo cosa succede se è stato fatto nell'altro modo.
soandos

Quindi i risultati sarebbero diversi. Mi dispiace, dovresti risolverlo da solo.
Yuval Filmus

2
@soandos In generale, possono esserci ben più attraversamenti DFS. Le nozioni utilizzate qui sono relative a un determinato attraversamento e differiranno per più attraversamenti.
Raffaello

9

Un attraversamento DFS in un grafico non orientato non lascerà un bordo incrociato poiché vengono esplorati tutti i bordi che sono incidenti su un vertice.

Tuttavia, in un grafico diretto, potresti imbatterti in un bordo che porta a un vertice che è stato scoperto prima tale che tale vertice non è un antenato o discendente dell'attuale vertice. Tale bordo viene chiamato bordo trasversale.


Aporov, grazie per la risposta. Mi sembra ancora che quando arrivi al vertice 6 nel DFS come illustrato in Wikipedia, hai tre bordi da attraversare da 6. A quel punto, il vertice 6 è "corrente". Alla fine attraverserai il bordo fino al vertice 3. Mentre 3 è già stato visitato, tuttavia poiché c'è un margine da 6 a 3, allora 3 è un discendente del vertice "attuale" 6. Se è così, viola la definizione di un bordo trasversale. Deve esserci qualcosa in più nella definizione che non viene reso molto esplicito.

In effetti, DFS contiene solo i bordi degli alberi per i bordi posteriori (Introduzione agli algoritmi Thm. 22.10).
jrhee17,

2

In un attraversamento DFS, i nodi sono finiti una volta terminati tutti i loro figli. Se si contrassegnano i tempi di rilevamento e fine per ciascun nodo durante l'attraversamento, è possibile verificare se un nodo è un discendente confrontando i tempi di inizio e fine. In effetti, qualsiasi attraversamento di DFS partizionerà i suoi bordi secondo la seguente regola.

Sia d [nodo] il tempo di scoperta del nodo, allo stesso modo sia [nodo] il tempo di fine.

Teorema tra parentesi Per tutte le u, v, vale esattamente una delle seguenti affermazioni:
1. d [u] <f [u] <d [v] <f [v] o d [v] <f [v] <d [u ] <f [u] e nessuno di voi v è un discendente dell'altro.

  1. d [u] <d [v] <f [v] <f [u] e v è un discendente di u.

  2. d [v] <d [u] <f [u] <f [v] e u è un discendente di v.

Quindi, d [u] <d [v] <f [u] <f [v] non può accadere.
Come le parentesi: () [], ([]) e [()] sono OK ma ([)] e [(]) non sono OK.

Ad esempio, considera il grafico con i bordi:
A -> B
A -> C
B -> C

Lascia che l'ordine di visita sia rappresentato da una stringa delle etichette dei nodi, dove "ABCCBA" significa A -> B -> C (finito) B (finito) A (finito), simile a ((())).

Quindi "ACCBBA" potrebbe essere un modello per "(() ())".

Esempi:
"CCABBA": Quindi A -> C è un bordo trasversale, poiché il CC non è all'interno di A.
"ABCCBA": Quindi A -> C è un bordo anteriore (discendente indiretto).
"ACCBBA": Quindi A -> C è un bordo dell'albero (discendente diretto).

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.