Ich schreibe einen Algorithmus, um den zweiten min-Kosten-Spannbaum zu finden. Meine Idee war wie folgt:
Meine Frage ist: Wird das funktionieren? Gibt es vielleicht einen besseren Weg, dies zu tun?
Du kannst es in O machen (V 2 ). Berechnen Sie zuerst die MST mit dem Prim-Algorithmus (kann in O gemacht werden (V 2 ) ).
Berechne max[u, v] = the cost of the maximum cost edge on the (unique) path from u to v in the MST
. Kann in O gemacht werden (V 2 ).
Finde eine Kante (u, v)
, die NICHT Teil der MST ist, die abs(max[u, v] - weight(u, v))
minimiert. Kann in O (E) == O (V 2 ) gemacht werden.
Gib MST' = MST - {the edge that has max[u, v] weight} + {(u, v)}
zurück, was dir die zweitbeste MST geben wird.
Hier ist ein Link zu Pseudocode und detaillierteren Erklärungen.
Betrachten Sie diesen Fall:
%Vor%Die MST besteht aus A-B-D-C (Kosten 6). Die zweite minimale Kosten ist A-B-C-D (Kosten 7). Wenn Sie die Kante mit den niedrigsten Kosten löschen, erhalten Sie stattdessen A-C-B-D (Kosten 105).
Also wird Ihre Idee nicht funktionieren. Ich habe jedoch keine bessere Idee ...
Sie können dies tun - versuchen Sie, die Kanten der MST einzeln aus der Grafik zu entfernen und führen Sie die MST aus, wobei Sie die Min aus der MST nehmen. Das ist ähnlich wie bei Ihnen, außer iterativ:
Das ist Larrys Antwort ähnlich.
Nachdem MST gefunden wurde,
Für jedes new_edge = keine Kante in MST
Lösung von folgendem Link.
Ссылка
Hier ist ein Algorithmus, der den 2. minimalen aufspannenden Baum in O (n ^ 2)
berechnet Sagen wir, die aktuelle Baumkante ist e. Dieser Baumrand teilt den Baum in zwei Bäume, sagen wir T1 und T-T1. e=(u,v)
, wobei u in T1 und v in T-T1 ist. = O (n ^ 2)
Wiederholen Sie dies für jeden Knoten v in T-T1. = O (n ^ 2)
Wählen Sie Kante e'=(u,v)
für alle v in T-T1 und e 'ist in G (Originalgraph) und es ist minimal
Berechne das Gewicht des neu gebildeten Baumes. Sagen wir W=weight(T)-weight(e)+weight(e')