Def: El puente es una ventaja, cuando se retiran, se desconectará la gráfica (o aumentar el número de componentes conectados por 1).
Una observación sobre puentes en gráfico; ninguno de los bordes que pertenecen a un bucle puede ser un puente. Por lo tanto, en un gráfico como A--B--C--A
, la eliminación de cualquiera de los bordes A--B
, B--C
y C--A
no desconectará el gráfico. Pero, para un gráfico no dirigido, el borde A--B
implica B--A
; y este borde aún podría ser un puente, donde el único bucle en el que se encuentra es A--B--A
. Entonces, deberíamos considerar solo esos bucles formados por un borde posterior. Aquí es donde ayuda la información principal que ha pasado en el argumento de la función. Le ayudará a no utilizar los bucles como A--B--A
.
Ahora para identificar el borde posterior (o el bucle), A--B--C--A
utilizamos las matrices low
y pre
. La matriz pre
es como la matriz visited
en el algoritmo dfs; pero en lugar de marcar solo el vértice como visitado, identificamos cada vértice con un número diferente (según su posición en el árbol dfs). La matriz low
ayuda a identificar si hay un bucle. La matriz low
identifica el vértice con el número más bajo (desde pre
) que puede alcanzar el vértice actual.
Permite trabajar a través de este gráfico A--B--C--D--B
.
A partir de una
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
En este punto, le ha surgido un ciclo/bucle en el gráfico. En su código if (pre[w] == -1)
será falso esta vez. Entonces, ingresarás a la parte else. La instrucción if allí está comprobando si B
es el vértice padre de D
. No lo es, por lo que D
absorberá B
pre
valor en low
. Continuando con el ejemplo,
dfs: ^
pre: 0--1--2--3
graph: A--B--C--D
low: 0--1--2--1
Este valor low
de D
se propaga de nuevo a través del código C
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
Ahora, que se identifica el ciclo/bucle, observamos que el vértice A
no es parte del bucle. Por lo tanto, imprime A--B
como un puente. El código low['B'] == pre['B']
significa que un borde a B
será un puente. Esto es porque, el vértice más bajo que podemos alcanzar desde B
es B
.
Espero que esta explicación ayude.
Falta la clase Graph. ¿Está disponible en alguna parte? – jedwards
No puse la clase de gráfico aquí. Tengo problemas para entender cómo encontrar los puentes. El gráfico se implementa como una lista de adyacencia. – frodo
@jedwards, la clase Graph es http://algs4.cs.princeton.edu/41undirected/Graph.java.html – Denis