Rozważmy wykres . Każda krawędź ma dwa obciążniki i . Znajdź drzewo które minimalizuje produkt . Algorytm powinien działać w czasie wielomianowym w odniesieniu do.A e B e ( ∑ e ∈ T A e ) ( ∑ e ∈ T B e ) | V | , | E |
Trudno mi dostosować dowolny tradycyjny algorytm na drzewach opinających (Kruskal, Prim, Usuwanie krawędzi). Jak to rozwiązać? Jakieś wskazówki?
Odpowiedzi:
Zakładam, że nie masz ujemnie ważonych krawędzi, ponieważ może to nie działać, jeśli występują ujemne wagi.
Algorytm
Dla każdej krawędzi oznacz je od do1 n
Niech waży A numeru krawędziai i
Niech waga B numeru krawędzi ibi i
Przygotuj ten stół
Każdy element tabeli jest iloczynem wiersza i kolumny.
Dla każdej krawędzi zsumuj odpowiedni wiersz tabeli i kolumnę (pamiętaj o usunięciu elementu w przecięciu, ponieważ został on zsumowany dwukrotnie).
Znajdź krawędź, która ma największą sumę, usuń ją, jeśli nie rozłączy wykresu. W przeciwnym razie zaznacz krawędź jako niezbędną. Jeśli krawędź została usunięta, wypełnij jej wiersze i kolumny wartością 0.
Poprawność
Rezultatem jest oczywiście drzewo.
Wynik jest oczywiście szeroki, ponieważ żadne wierzchołki nie są odłączone.
Wynik jest minimalny? Jeśli istnieje inna krawędź, której usunięcie spowoduje utworzenie mniejszego drzewa opinającego na końcu algorytmu, wówczas krawędź ta zostałaby najpierw usunięta i unieważniona. (gdyby ktoś pomógł mi uczynić to nieco bardziej rygorystycznym / i / lub kontrprzykładowym, byłoby świetnie)
Środowisko wykonawcze
Oczywiście wielomian w.|V|
edytować
Następnie
Skończ z(2,11),(4,6)=6∗17=102
Inne drzewa rozpinające są
źródło
To jest rozwiązanie z http://www.cnblogs.com/autsky-jadek/p/3959446.html .
Możemy zobaczyć każde drzewo opinające jako punkt na płaszczyźnie , gdzie jest sumą masy , y jest sumą wagi . Celem jest zminimalizowanie .x−y x ∑e∈TAe ∑e∈TBe xy
Znajdź minimalne drzewo rozpinające według wagi i waga . Tak więc mamy dwa punkty w płaszczyźnie xy . We wszystkich punktach drzewa rozpinającego w płaszczyźnie ma minimum , ma minimum .A B A,B A x B y
Teraz staramy się znaleźć punkt w trójkącie który ma maksymalną odległość do linii , abyśmy mogli zminimalizować wartość dla dla wszystkich punktów w trójkącie .C OAB AB xy C ABC
Ponieważ .2SABC=|AB−→−×AC−→−|=(Bx−Ax,By−Ay)×(Cx−Ax,Cy−Ay)=(Bx−Ax)⋅Cy+(Ay−By)⋅Cx−Ay(Bx−Ax)+Ax(By−Ay)
Zauważ, że jest stałą, więc teraz dążymy do maksymalizacji . Więc tworzymy nowy wykres , podczas gdy waga . Teraz uruchamiamy maksymalne drzewo rozpinające na do uzyskania punktu . ( B x - A x )⋅ C y +( A y - B y )⋅ C x G ′ =(V,E)w(e)= B e ( B x - A x )+ C x ( A y - B y )Ay(Bx−Ax)+Ax(By−Ay (Bx−Ax)⋅Cy+(Ay−By)⋅Cx G′=(V,E) w(e)=Be(Bx−Ax)+Cx(Ay−By) G′ C
Uruchom powyższy algorytm na rekurencyjnie, aż nie ma więcej drzew obejmujące między i .BOBC,OAC OBC,AC O
Teraz otrzymujemy zestaw możliwych drzew spinających. Oblicz wartość dla każdego drzewa, aby uzyskać minimalne drzewo.xy
źródło