Por lo que puedo decir, Brian no solo tiene la corazonada, sino una proposición aún más fuerte contiene: cada borde que no está en el árbol de expansión mínimo agrega exactamente un nuevo "ciclo de base".
Para ver esto, veamos qué sucede cuando agrega un borde E que no está en el MST. Hagamos la forma matemática favorita para complicar las cosas y agregar algo de notación;) Llame al gráfico original G, al gráfico antes de agregar E G ', y al gráfico después de agregar E G' '. Entonces, necesitamos averiguar cómo cambia el "recuento del ciclo base" de G 'a G' '.
Agregar E debe cerrar al menos un ciclo (de lo contrario, E estaría en el MST de G en primer lugar). Así que obviamente debe agregar al menos un "ciclo base" a los ya existentes en G '. ¿Pero agrega más de uno?
No puede agregar más de dos, ya que ningún borde puede ser miembro de más de dos ciclos básicos. Pero si E es un miembro de dos ciclos de base, entonces la "unión" de estos dos ciclos de base debe haber sido un ciclo de base en G ', así que de nuevo obtenemos que el cambio en el número de ciclos sigue siendo uno.
Ergo, para cada borde no en MST se obtiene un nuevo ciclo de base. Entonces la parte "contar" es simple. Encontrar todos los bordes para cada ciclo de base es un poco más difícil, pero siguiendo el razonamiento anterior, creo que esto podría hacerlo (en pseudo-Python):
for v in vertices[G]:
cycles[v] = []
for e in (edges[G] \ mst[G]):
cycle_to_split = intersect(cycles[e.node1], cycles[e.node2])
if cycle_to_split == None:
# we're adding a completely new cycle
path = find_path(e.node1, e.node2, mst[G])
for vertex on path:
cycles[vertex].append(path + [e])
cycles
else:
# we're splitting an existing base cycle
cycle1, cycle2 = split(cycle_to_split, e)
for vertex on cycle_to_split:
cycles[vertex].remove(cycle_to_split)
if vertex on cycle1:
cycles[vertex].append(cycle1)
if vertex on cycle2:
cycles[vertex].append(cycle2)
base_cycles = set(cycles)
Editar: el código debe encontrar toda la base ciclos en un gráfico (los base_cycles establecidos en la parte inferior).Los supuestos son que usted sabe cómo:
- encontrar el árbol de expansión mínimo de un grafo (MST [G])
- ver la diferencia entre dos listas (bordes \ MST [G])
- hallazgo una intersección de dos listas
- encontrar el camino entre dos vértices en un MST
- dividir un ciclo en dos por la adición de un punto que la hace (la función split)
Y principalmente sigue la discusión anterior. Para cada borde que no esté en el MST, tiene dos casos: o trae un ciclo de base completamente nuevo, o divide uno existente en dos. Para rastrear cuál de los dos es el caso, rastreamos todos los ciclos base de los que forma parte un vértice (utilizando el diccionario de ciclos).
Hola, el enlace en Google drive está muerto, ¿podrías actualizarlo si es posible? – kebs