Il grafico ha due / tre alberi di spanning minimi diversi?


15

Sto cercando di trovare un metodo efficiente per rilevare se un dato grafico G ha due alberi spanning minimi diversi. Sto anche cercando di trovare un metodo per verificare se ha 3 diversi spanning tree minimi. La soluzione ingenua di cui ho pensato è eseguire l'algoritmo di Kruskal una volta e trovare il peso totale dell'albero di spanning minimo. Successivamente, rimuovendo un bordo dal grafico ed eseguendo nuovamente l'algoritmo di Kruskal e verificando se il peso del nuovo albero è il peso dell'albero di spanning minimo originale, e quindi per ciascun bordo nel grafico. Il runtime è O (| V || E | log | V |) che non è affatto buono, e penso che ci sia un modo migliore per farlo.

Qualsiasi suggerimento sarebbe utile, grazie in anticipo


Sarebbe bello essere al corrente di tale algoritmo, ma non risolverà questo problema attuale
itamar

2
Il grafico avrà un unico spanning tree minimo se e solo se (1) per qualsiasi partizione di V ( G ) in due sottoinsiemi, il bordo del peso minimo con un punto finale in ciascun sottoinsieme è unico e (2) il peso massimo il bordo in ogni ciclo di G è unico. GV(G)G
Juho,

Queste domande una e due rispondono già alla tua domanda?
Juho,

Vedere il problema 23-1 in CLRS per come trovare il secondo MST migliore in . O(n2)
Kaveh,

Risposte:


7

Kapoor & Ramesh ( corretta versione SIAM J. Comput. , Gratuito (?) Versione sito personale ) danno un algoritmo per l'enumerazione tutta minimo spanning tree in entrambi i grafici ponderati e non ponderati.

La mia comprensione dell'idea di base è che inizi con un MST, quindi scambia i bordi che si trovano lungo i cicli nel grafico (quindi finché i pesi sono a posto, stai sostituendo un bordo con un altro che sai ricollegherà l'albero) .

Per il caso ponderato danno un tempo di esecuzione per elencare tutti gli alberi di spanning minimi di dove N è il numero di tali alberi di spanning. Li enumera in ordine crescente di peso e la mia attuale comprensione (superficiale) suggerisce che è perfettamente fattibile terminare l'algoritmo dopo che ha generato un determinato numero di alberi (poiché inizia con l'MST e li produce in sequenza).O(N|V|)N


In questa situazione, vorremmo interrompere presto l'algoritmo una volta che sappiamo che ci sono più di soluzioni. L'algoritmo lo consente? k
Raffaello

1
@Raphael, non ho avuto il tempo di affrontarlo davvero (marcatura di assegnazione yay), ma dalla mia comprensione approssimativa, dovrebbe essere possibile - inizia con un MST, quindi ne genera altri uno per uno da esso.
Luke Mathieson,

1
@SaeedAmiri: "Il numero di tali alberi spanning" indica "il numero di alberi spanning minimi ", non "il numero di alberi spanning". Se tutti gli spanning tree sono spanning minimo, il grafico di input è completo e tutti i bordi hanno lo stesso peso. nn2
JeffE,

1
Il documento prende in considerazione sia i grafici ponderati che quelli non ponderati, quindi hai ragione entrambi;). Penso anche che l'algoritmo consenta la possibilità di fermarsi dopo aver generato il numero di alberi desiderato, quindi per OP questo lo porta a . Ancora una volta, ho bisogno di un po 'di tempo libero per avere un aspetto migliore. O(|V|)
Luke Mathieson,

1
Dopo una lettura veloce, l'algoritmo ponderato genera gli alberi in ordine crescente di peso (partendo ovviamente da un MST). Quindi dovrebbe essere ai fini del PO.
Luke Mathieson,

2

Si può dimostrare che l'algoritmo di Kruskal può trovare ogni minimo spanning tree; vedi qui .

Pertanto, è possibile eseguire Kruskal e ogni volta che si hanno più spigoli tra cui scegliere, ramo. Una volta che hai ramificato volte, sai che ci sono almeno k diversi spanning tree minimi. kkSfortunatamente, più rami possono provocare lo stesso albero aggiungendo bordi dello stesso peso in ordini diversi, quindi questo non aiuta molto senza ulteriore lavoro / approfondimento.


5
No. Se devi scegliere tra i bordi in un solo passaggio, è possibile che quei bordi k siano presenti in tutti gli alberi che si estendono. Prendiamo ad esempio solo una stella K 1 , 5 con tutti i bordi di peso 1. Primo passo, devi scegliere tra i 5 bordi, ecc. Ma ovviamente c'è solo un albero che si estende. Forse contare il numero di bordi con lo stesso peso su un bordo incluso nell'albero di spanning che viene lasciato fuori aiuta? Interessante domanda ...kkK1,5
vonbrand,

@vonbrand Un buon punto. Possiamo continuare a finire tutti i rami del calcolo, ovviamente, ma il tempo di esecuzione è determinato dal numero di spanning tree, che può essere esponenziale.
Raffaello

1

Per vedere se esiste più di un MST, considera ad esempio l'algoritmo di Kruskal. L'unico modo in cui potrebbe costruire MST diversi è quello di tralasciare i bordi scegliendone un altro quando ce ne sono diversi con lo stesso peso. Ma quei bordi dello stesso peso avrebbero potuto essere esclusi perché formavano un ciclo con bordi più chiari ...

Quindi dovresti eseguire l'algoritmo di Kruskal e quando ci sono diversi spigoli con lo stesso peso da considerare, aggiungi tutti quelli che possono essere aggiunti senza creare cicli. Se rimane un bordo di questo peso e non si chiude un ciclo con nessuno dei bordi con pesi inferiori (che sono stati aggiunti in precedenza), è presente più di un MST. Controllare se ce ne sono esattamente 2 o 3 o più, ecc. Sembra molto più difficile ...


0

Modifica dell'algoritmo di Kruskal: mentre ordini i bordi, raggruppa i bordi con lo stesso peso. Ora, nel punto in cui elaborate i bordi in ordine, ogni volta che raggiungete un nuovo cluster, controllate prima tutti i bordi separatamente e rimuovete dal cluster quelli che avrebbero chiuso un ciclo, dato ciò che era stato creato prima del cluster. Quindi eseguire tutti i bordi rimanenti nel cluster ora cercando di aggiungerli al MST. Se qualcuno di loro chiude un ciclo, ciò era necessariamente a causa di altri bordi dello stesso cluster precedentemente inseriti, il che significa che hai più di un MST.

Questa soluzione preserva la complessità dell'algoritmo di Kruskal, ma solo aumenta il tempo per ogni fronte elaborato.


Sembra che tu stia affermando che puoi elaborare un intero cluster in tempo costante, ma non vedo alcuna costante evidente legata alla dimensione di un cluster. Potresti fornire maggiori dettagli su come viene realizzato quel palcoscenico?
David Richerby,
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.