Def: Bridge è un bordo, quando rimosso, disconnetterà il grafico (o aumenterà il numero di componenti collegati di 1).
Un'osservazione riguardante i ponti nel grafico; nessuno dei bordi che appartengono a un loop può essere un ponte. Pertanto, in un grafico come A--B--C--A
, la rimozione di qualsiasi spigolo A--B
, B--C
e C--A
non scollegherà il grafico. Ma, per un grafico non orientato, il limite A--B
implica B--A
; e questo bordo potrebbe essere ancora un ponte, in cui l'unico anello in cui si trova è A--B--A
. Quindi, dovremmo considerare solo quei loop formati da un bordo posteriore. Qui è dove le informazioni genitore che hai passato nell'argomento funzione aiutano. Ti aiuterà a non usare i loop come A--B--A
.
Ora per identificare il bordo posteriore (o il loop), A--B--C--A
utilizziamo gli array low
e pre
. L'array pre
è come l'array visited
nell'algoritmo dfs; ma invece di segnalare semplicemente il vertice come visitato, identifichiamo ciascun vertice con un numero diverso (in base alla sua posizione nell'albero dfs). L'array low
consente di identificare se esiste un ciclo. L'array low
identifica il vertice con il numero più basso (da pre
) che il vertice corrente può raggiungere.
Consente di lavorare con questo grafico A--B--C--D--B
.
a partire da un
dfs: ^ ^ ^ ^ ^
pre: 0 -1 -1 -1 -1 0--1 -1 -1 1 0--1--2 -1 1 0--1--2--3 1 0--1--2--3--1
graph: A--B--C--D--B A--B--C--D--B A--B--C--D--B A--B--C--D--B A--B--C--D--B
low: 0 -1 -1 -1 -1 0--1 -1 -1 1 0--1--2 -1 1 0--1--2--3 1 0--1--2--3->1
A questo punto, hai incontrato un ciclo/ciclo sul grafico. Nel tuo codice if (pre[w] == -1)
questa volta sarà falso. Quindi, entrerai nella parte else. L'istruzione if sta verificando se B
è il vertice principale di D
. Non lo è, quindi D
assorbirà il valore di pre
in low
. Continuando l'esempio,
dfs: ^
pre: 0--1--2--3
graph: A--B--C--D
low: 0--1--2--1
Questo valore low
di D
si propaga all'indietro fino C
attraverso il codice low[v] = Math.min(low[v], low[w]);
.
dfs: ^ ^ ^
pre: 0--1--2--3--1 0--1--2--3--1 0--1--2--3--1
graph: A--B--C--D--B A--B--C--D--B A--B--C--D--B
low: 0--1--1--1--1 0--1--1--1--1 0--1--1--1--1
Ora, che il ciclo/ciclo viene identificato, si nota che il vertice A
non fa parte del ciclo. Quindi, stampa A--B
come un ponte. Il codice low['B'] == pre['B']
indica che un fronte a B
sarà un bridge. Questo perché il vertice più basso che possiamo raggiungere da B
è lo stesso B
.
Spero che questa spiegazione aiuti.
Ti manca la classe Graph. È disponibile da qualche parte? – jedwards
Non ho messo la classe del grafico qui. Sto avendo problemi a capire come trovare i ponti. Il grafico è implementato come elenco di adiacenza. – frodo
@jedwards, la classe Graph è http://algs4.cs.princeton.edu/41undirected/Graph.java.html – Denis