Albero di spanning minimo con parametri a doppio peso


12

Considera un grafico . Ogni bordo ha due pesi e . Trova un albero di spanning che minimizzi il prodotto . L'algoritmo dovrebbe essere eseguito in tempo polinomiale rispetto a.e A e B e ( e T A e ) ( e T B e ) | V | , | E |G(V,E)eAeBe(eTAe)(eTBe)|V|,|E|

Trovo difficile adattare uno qualsiasi degli algoritmi tradizionali su spanning tree (Kruskal, Prim, Edge-Deletion). Come risolverlo? Qualche suggerimento?


Forse provare a costruire un nuovo grafico, in cui il peso di un bordo è . max ( A e , B e )emax(Ae,Be)
utdiscant,

3
È un problema / esercizio a casa? In tal caso, proviene da un libro di testo? Il motivo per cui chiedo è che il contesto possa aiutare a "decodificare" il problema. Non è immediatamente ovvio che un algoritmo goloso sia appropriato qui, ma se proviene dal capitolo sugli algoritmi golosi ...
Joe

1
@utdiscant, che non funzionerà. I bordi negativi possono essere utili.
Nicholas Mancuso,

anche per i bordi positivi non è utile, ad esempio la coppia (10,10) non è migliore della coppia (11,1) nella maggior parte dei casi.

Risposte:


1

Suppongo che non ti vengano dati bordi con ponderazione negativa, perché potrebbe non funzionare se ci sono pesi negativi.

Algoritmo

Per ciascuno dei bordi, etichettarli da an1n

Lascia peso A del numero del bordo ioaii

Lascia che peso B del numero del bordo ibii

Prepara questa tabella

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

Con ciascuno degli elementi della tabella il prodotto di riga e colonna.

Per ogni bordo, sommare la riga e la colonna della tabella pertinente (e ricordare di rimuovere l'elemento nell'intersezione poiché è stato sommato due volte).

Trova il bordo con la somma maggiore, eliminalo se non disconnette il grafico. Segna il bordo come essenziale altrimenti. Se un bordo è stato eliminato, riempire le sue righe e colonne con 0.

Correttezza

Il risultato è ovviamente un albero.

Il risultato è ovviamente spanning poiché nessun vertice è disconnesso.

Il risultato è minimo? Se esiste un altro bordo la cui eliminazione creerà un albero di spanning più piccolo alla fine dell'algoritmo, quel bordo sarebbe stato prima eliminato e annullato. (se qualcuno potesse aiutarmi a rendere questo un po 'più rigoroso / e / o contro esempio, sarebbe fantastico)

Runtime

Ovviamente polinomiale in.|V|

modificare

(2,11),(11,2),(4,6) è non un esempio contatore.

a1=2,a2=11,a3=4

b1=11,b2=2,b3=6

Poi

   | 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) viene rimosso.

Termina con(2,11),(4,6)=617=102

Altri alberi spanning sono

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

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


1
Mi sembra che questo sia un approccio piuttosto avido. Non sono convinto dalla tua "prova" di minimalismo.
Nejc,

1
@SaeedAmiri Come è un contro esempio? Ho pubblicato il lavoro nella sezione modificata, l'algoritmo fornisce il risultato corretto.
Herp Derpington

1
Quello che hai fatto è scoprire quanto ciascuno contribuisce in e scegli quelli che hanno il maggior impatto. Va bene, ma non è ciò che è richiesto. È una domanda difficile. Se vuoi migliorare la tua risposta, devi presentare una prova. Altrimenti, non serve. e E a i . e E b i(ai,bi)eEai.eEbi
AJed

tuttavia è molto ingiusto ottenere un voto negativo per i propri sforzi.
AJed

@AJed La dimostrazione è la stessa dell'eliminazione prim / kush / reverse. Tutto ciò che dobbiamo dimostrare ora è che la proprietà di taglio è ancora valida.
Herp Derpington,

1

Questa è la soluzione di http://www.cnblogs.com/autsky-jadek/p/3959446.html .

Possiamo vedere ogni albero di spanning come un punto nel piano , dove è la somma del peso , y è la somma del pesox e T A ee T B e x yxyxeTAeeTBe . L'obiettivo è ridurre al minimo .xy

  1. Trova il minimo spanning tree in base al peso e il peso . Quindi abbiamo due punti nel piano xy . In tutti i punti dell'albero spanning nel piano, ha il minimo , ha il minimo .B A , B A x B yABA,BAxBy

  2. Ora miriamo a trovare un punto nella del triangolo che abbia la massima distanza dalla linea , in modo che possiamo avere il valore per minimizzato per tutti i punti nel triangolo .O A B A B x y C A B CCOABABxyCABC

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

  1. Nota che è una costante, quindi ora puntiamo a massimizzare . Quindi creiamo un nuovo grafico , mentre il peso . Ora eseguiamo un albero di spanning massimo su per ottenere il punto .Ay(BxAx)+Ax(ByAy(BxAx)Cy+(AyBy)CxG=(V,E)w(e)=Be(BxAx)+Cx(AyBy)GC

  2. Eseguire l'algoritmo sopra ricorsivamente, fino a quando non c'è più spanning alberi tra e .B C , A C OOBC,OACBC,ACO

  3. Ora abbiamo una serie di possibili spanning tree. Calcola il valore per ogni albero per ottenere l'albero minimo.xy

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.