Z tego, co wiem, nie tylko punkt przeczucia Briana, ale jeszcze silniejsza propozycja hold: każda krawędź, która nie znajduje się w minimalnym drzewie opinającym, dodaje dokładnie jeden nowy "cykl bazowy".
Aby to zobaczyć, zobaczmy, co się stanie, gdy dodasz krawędź E, której nie ma w MST. Zróbmy ulubiony sposób matematyki, aby komplikować rzeczy i dodać notację;) Wywołaj oryginalny wykres G, wykres przed dodaniem E G ', a wykres po dodaniu E G' '. Musimy więc dowiedzieć się, w jaki sposób zmienia się "liczba cykli bazowych" z G 'na G' '.
Dodanie E musi zamknąć co najmniej jeden cykl (w przeciwnym razie E byłoby w MST z G w pierwszej kolejności). Więc oczywiście musi dodać przynajmniej jeden "podstawowy cykl" do już istniejących w G '. Ale czy dodaje więcej niż jeden?
Nie można dodać więcej niż dwa, ponieważ żadna krawędź nie może być członkiem więcej niż dwóch cykli bazowych. Ale jeśli E jest członkiem dwóch podstawowych cykli, to "zjednoczenie" tych dwóch podstawowych cykli musiało być podstawowym cyklem w G ', więc znowu otrzymujemy, że zmiana liczby cykli jest wciąż jedna.
Ergo, dla każdej krawędzi nie w MST otrzymujesz nowy cykl podstawowy. Więc część "liczenia" jest prosta. Znalezienie wszystkie krawędzie dla każdego cyklu bazowej jest trochę trudniejsze, ale następujące rozumowanie powyżej, myślę, że to może to zrobić (w 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)
Edit: kod powinien znaleźć wszystkie bazy cykle na wykresie (base_cycles ustawione na dole).Założenia są takie, że wiesz, jak:
- znaleźć minimalne drzewo rozpinające grafu (MST [g])
- znaleźć różnicę pomiędzy dwoma listami (krawędzie \ MST [g])
- find skrzyżowanie dwóch listach
- znaleźć drogę między dwoma wierzchołkami na MST
- podzielić na dwie części cyklu poprzez dodanie do niej krawędzi (funkcja split)
I wynika głównie z powyższej dyskusji. Dla każdej krawędzi nie w MST masz dwa przypadki: albo przynosi całkowicie nowy cykl podstawowy, albo dzieli istniejący na dwa. Aby śledzić, który z tych dwóch przypadków dotyczy, śledzimy wszystkie cykle bazowe, których częścią jest wierzchołek (używając słownika cykli).
Witam, link na Dysku Google nie działa, czy mógłbyś dokonać aktualizacji, jeśli to możliwe? – kebs