2011-11-16 5 views
7

Abbiamo un digrafo debolmente aciclico.Algoritmo del tempo lineare per creare un grafico fortemente connesso

Inoltre, viene fornito un set A che mantiene i vertici di G che hanno lo zero in-degree e un set B che trattiene i vertici che hanno zero di grado zero. (la dimensione di A è minore della dimensione di B).

Inoltre, sappiamo anche che se gli elementi in A e B hanno un ordine particolare DFS ha iniziato alle visite ai bi (1≤ i ≤ m).

È possibile progettare un algoritmo di tempo lineare che rende G fortemente connesso aggiungendo ad esso il minor numero possibile di spigoli?

+0

-> math.stackexchange.com? – Vlad

+0

"DFS ha iniziato alle visite ai bi (1≤ i ≤ m)" Non capisco. C'è (1) elementi ripetuti in A e vuoti in B OR (2) il tuo grafico ha una proprietà speciale, che partendo dal vertice in gradi zero possiamo raggiungere un punto rigorosamente uno zero di grado zero (3) niente di quello (dai la tua spiegazione in quel caso). –

risposta

4

Aggiungi archi b j -> un j + 1 per j = 1, ..., m-1 e archi b j -> un per j = m, ... , n.

Il grafico risultante è fortemente connesso perché la A e B sono fortemente collegati da archi aggiunti e percorsi da un i a B i e, per ogni nodo x, esistono i, j tale che vi esiste un percorso nel grafico originale da un i a xe un percorso nel grafico originale da xa b j.

Non possiamo usare meno archi, perché un arco in uscita deve essere aggiunto a ciascuna delle b , ..., b n.

+0

È molto semplice. Ma c'è una domanda. C'è un'ambiguità nella dichiarazione originale ** Ho chiesto di **. Se hai indirizzato un grafico aciclico in cui la versione non diretta di esso è un grafo connesso E il numero di vertici con zero in-degree (A) minore o uguale al numero di vertici con zero esterno (B) non significa che hai corrispondenza tra A e B. ** Se riesci a dimostrarlo, fallo. Senza questo fatto non è una risposta **. –

+0

@ Vento della saggezza Perché dovrei provare ciò che è chiaramente un'ipotesi nella formulazione della domanda corrente? – Per

+0

Potrebbe esserci un problema con questa soluzione. Considera un grafico composto da due anelli, X e Y e un punto isolato.C'è un collegamento da X a Y e da Y al punto isolato. Il punto isolato è l'unico membro del set B. È connesso come un grafo aciclico, ma non fortemente connesso, perché non è possibile ottenere da Y a X, o dal nodo isolato a Y. Poiché A non ha elementi, la tua proposta non aggiungere link. – mcdowella

1

Edited - Dopo non produce una soluzione con meno link:

È possibile eseguire http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm in tempo lineare. Vi propongo di farlo e di notare che "nessun componente fortemente connesso verrà identificato prima di nessuno dei suoi successori". Pertanto, la prima componente fortemente fuori dal grafico non deve essere un successore di nessuno degli altri componenti. Suggerisco che ogni volta che si emette un componente fortemente connesso che non ha alcun successore, si aggiunge un collegamento che lo collega a questo primo componente. Suggerisco di aggiungere anche un collegamento ogni volta che si riavvia sostanzialmente l'algoritmo di Tarjan con una chiamata non ricorsiva a strongconnect(), collegando il primo componente al vertice al quale si sta riavviando.

Con questi collegamenti è possibile ottenere dal primo componente forte a ogni altro componente e da ogni altro componente al primo componente forte. - sfortunatamente questa non è necessariamente la soluzione con i collegamenti minimi - vedi il secondo commento di Per sotto.

+0

Come gestisci più di un componente senza predecessori? – Per

+0

La mia intenzione è che i componenti secondari senza predecessori siano i componenti con i quali l'algoritmo di Tarjan si riavvia con chiamate non ricorsive, in modo da ottenere collegamenti dal primo componente e diventare raggiungibili da esso. I loro successori, o loro stessi, ottengono collegamenti al primo componente, completando il ciclo. Tuttavia dal momento che il punto che ho sollevato sulla tua risposta era sbagliato, forse ho sbagliato anche qui? – mcdowella

+0

Se comprendo correttamente il tuo algoritmo, quindi sul grafico {a1-> b1, a1-> b2, a2-> b2}, il componente forte {a1} potrebbe essere il primo emesso, seguito da {b1} e {b2}, quindi b1 e b2 riportano i link a a1. Il collegamento a1 e a2 richiede un altro collegamento per un totale di 3, rispetto al 2 richiesto per connettere b1-> a2, b2-> a1. – Per