Minimalne drzewo opinające z podwójnymi parametrami wagi

12

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.G(V,E)A e B e ( e T A e ) ( e T B e ) | V | , | E |eAeBe(eTAe)(eTBe)|V|,|E|

Trudno mi dostosować dowolny tradycyjny algorytm na drzewach opinających (Kruskal, Prim, Usuwanie krawędzi). Jak to rozwiązać? Jakieś wskazówki?

Strin
źródło
Może spróbuj zbudować nowy wykres, w którym waga krawędzi wynosi . emax(Ae,Be)
utdiscant
3
Czy to jest zadanie domowe / ćwiczenie? Jeśli tak, to czy pochodzi z podręcznika? Pytam o to, że kontekst może pomóc w „inżynierii wstecznej” problemu. Nie jest od razu oczywiste, że chciwy algorytm jest tutaj odpowiedni, ale jeśli pochodzi on z rozdziału o algorytmach zachłannych ...
Joe
1
@utdiscant, to nie zadziała. Przydatne mogą być krawędzie ujemne.
Nicholas Mancuso
nawet dla dodatnich krawędzi nie jest przydatna, np. para (10,10) nie jest lepsza niż para (11,1) w większości przypadków.

Odpowiedzi:

1

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 do1n

Niech waży A numeru krawędziaii

Niech waga B numeru krawędzi ibii

Przygotuj ten stół

   |a_1 a_2 a_3 a_4 .. a_n
---+-------------------------
b_1|.........................
b_2|.........................
 . |.........................
 . |.........................
b_n|...................a_n * b_n

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ć

(2,11),(11,2),(4,6) jest nie przykładem licznika.

a1=2,a2=11,a3=4

b1=11,b2=2,b3=6

Następnie

   | 2     11     4
---+--------------------
11 | 22    121    44
 2 | 4     22     8
 6 | 12    66     24

(4,6)=44+8+24+66+12=154(2,11)=22+4+12+121+44=203(11,2)=121+22+66+4+8=221

(11,2) zostaje usunięty.

Skończ z(2,11),(4,6)=617=102

Inne drzewa rozpinające są

(11,2),(4,6)=1512=180

(2,11),(11,2)=1313=169

Herp Derpington
źródło
1
Wydaje mi się, że jest to raczej chciwe podejście. Nie przekonuje mnie twój „dowód” na minimalizm.
Nejc
1
@SaeedAmiri Jak to jest kontrprzykład? Umieściłem pracę w edytowanej sekcji, algorytm daje poprawny wynik.
Herp Derpington
1
To, co zrobiłeś, to ustalenie, ile każdy wnosi w , a ty wybierasz te, które mają największy wpływ. To dobrze, ale nie jest to wymagane. To trudne pytanie. Jeśli chcesz poprawić swoją odpowiedź, musisz przedstawić dowód. W przeciwnym razie nie ma sensu. (ai,bi)eEai.eEbi
AJed
bardzo niesprawiedliwe jest jednak głosowanie w dół za twój wysiłek.
AJed
@AJed Dowód jest taki sam jak w przypadku prim / kush / reverse delete. Wszystko, co musimy teraz udowodnić, to to, że wycięta nieruchomość nadal obowiązuje.
Herp Derpington
1

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 .xyxeTAeeTBexy

  1. 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 .ABA,BAxBy

  2. 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 .COABABxyCABC

Ponieważ .2SABC=|AB×AC|=(BxAx,ByAy)×(CxAx,CyAy)=(BxAx)Cy+(AyBy)CxAy(BxAx)+Ax(ByAy)

  1. 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(BxAx)+Ax(ByAy(BxAx)Cy+(AyBy)CxG=(V,E)w(e)=Be(BxAx)+Cx(AyBy)GC

  2. Uruchom powyższy algorytm na rekurencyjnie, aż nie ma więcej drzew obejmujące między i .BOBC,OACOBC,ACO

  3. Teraz otrzymujemy zestaw możliwych drzew spinających. Oblicz wartość dla każdego drzewa, aby uzyskać minimalne drzewo.xy


źródło