Riduzione transitiva di DAG


13

Sto cercando l'algoritmo O (V + E) per trovare la riduzione transitiva dato un DAG.

Ciò significa rimuovere il maggior numero possibile di spigoli in modo che se si potesse raggiungere v da u, per vu arbitrari, è ancora possibile raggiungere dopo la rimozione dei bordi.

Se questo è un problema standard, ti prego di indicarmi una soluzione modello.


Non puoi usare il riferimento fornito nel lemma di Wikipedia che citi?
Hendrik Jan

2
Bene, l'algoritmo discusso in Wikipedia funziona in (nel migliore dei casi, vale a dire, nel caso dei grafici aciclici) invece di come richiesto. Penso che la risposta giusta qui sia che l'algoritmo che stai attualmente cercando potrebbe non esistereO ( V + E )O(V×E)O(V+E)
Carlos Linares López,

1
Concordato sul fatto che non è chiaro che ciò che stai chiedendo esiste. Ci sono alcuni documenti che non sarebbero interessanti se esistesse un tale algoritmo, ad esempio sciencedirect.com/science/article/pii/0012365X9390164O . Detto questo, se puoi essere più specifico su quale sia la tua motivazione, potrebbero esserci soluzioni più specifiche. Ad esempio, conosci qualcos'altro sul grafico o funzionerebbe? O(n(n+m))
William Macrae,

Ho visto il problema da qualche parte, ma non c'erano informazioni aggiuntive, forse un errore di battitura nel problema.
Karan,

1
Che cosa succede se esegui un ordinamento topologico nel tuo DAG, ma tieni traccia dei vertici raggiungibili utilizzando i figli, ovvero , quindi inizia dall'ultimo elemento nel grafico ordinato, e rimuovere i bordi inutilizzati e salire preservando la funzione raggiungibile, questo ti dà i bordi massimi possibili da rimuovere, ma non sono sicuro che ottenga la massima possibilità (è .O ( | E | + | V | )reachable[v]=vchildrenvreachable[v]O(|E|+|V|)

Risposte:


8

Possiamo risolvere questo problema semplicemente eseguendo DFS da ciascun vertice.

  1. Per ogni vertice , avvia il DFS da ciascun vertice tale che sia il discendente diretto di , cioè. è un vantaggio.v v u ( u , v )uGvvu(u,v)
  2. Per ogni vertice raggiungibile dal DFS da , rimuovere il bordo .vv(u,v)

La complessità generale di quanto sopra è la complessità di eseguire DFS ', che è .NO(N(N+M))


1
Si noti che, asintoticamente, questo ha la stessa complessità dell'algoritmo nell'articolo di Wikipedia collegato alla domanda stessa. O(NM)
David Richerby,

1
Concordato. Poiché per questa domanda era necessaria una risposta concisa, ne ho presentata una. Inoltre, una soluzione è IMO, improbabile. O(N)
pratyaksh

3

Non è quello che stai cercando. Ma solo per la condivisione delle conoscenze scopo, è possibile farlo con la i messaggi se si assume che ogni vertice di agire come un processore . Nota che ogni vertice ha un valore comparabile. Pertanto, esistono alcuni vertici tali che sono più grandi di tutti i loro vicini. Questi vertici fanno quanto segue:O(|E|)

  1. Sia il vicino più piccolo massimo di ,uv
  2. inviare un messaggio a e comprendono bordo in uscita.u(v,u)
  3. Per ogni vicino di e (e più piccolo di entrambi), non includerewuv in uscita.(v,w)
  4. Ripetere i passaggi fino a quando tutti i bordi per un vicino più piccolo v del vertice v sono inclusi o non inclusi nell'output.(v,v)vv

Ora se un nodo ricevuto un messaggio da ogni vicino più grande (cioè tutti i bordi ( v , v ) sono inclusi o non inclusi, allora il nodo v si comporta come se fosse il più grande del suo vicinato. Cioè, esegue il 4 passaggi precedentemente menzionati.v(v,v)v

Questo algoritmo termina in i messaggi in un ambiente distribuito. So che non è quello che stai chiedendo.O(|E|)


1

Lemma: Se esiste un bordo V -> Y e Y è anche un successore indiretto di V, (ad es. V -> W -> + Y), allora il bordo V -> Y è transitivo e non fa parte della radice transitiva.

Metodo: tenere traccia della chiusura transitiva di ciascun vertice, operando dal vertice ai vertici iniziali in ordine topologico inverso. L'insieme dei successori indiretti di V è l'unione delle chiusure transitive dei successori immediati di V. La chiusura transitiva di V è l'unione dei suoi successori indiretti e dei suoi successori immediati.

Algoritmo:

    Initialise Visited as the empty set.
    For each vertex V of G, 
        Invoke Visit(V).

    Visit(V):
        If V is not in Visited,
            Add V to Visited, 
            Initialise Indirect as the empty set,
            For each edge V -> W in G,
                Invoke Visit(W),
                Add Closure(W) to Indirect.
            Set Closure(V) to Indirect.
            For each edge V -> W in G,
                Add W to Closure(V),
                If W is in the set Indirect,
                    Delete the edge V -> W from G.

Questo presuppone che tu abbia un modo efficace per tenere traccia di insiemi di vertici (ad es. Bitmap), ma penso che questa ipotesi sia fatta anche in altri algoritmi O (V + E).

Un effetto collaterale potenzialmente utile è che trova la chiusura transitiva di ciascun vertice di G.


Ho eliminato la risposta postata sul tuo account precedente. Se desideri comunque unire i tuoi due account, segui i passaggi nel Centro assistenza . Detto questo, dal momento che l'account precedente non ha più contenuti visibili, puoi semplicemente attenerti a quello nuovo.
Gilles 'SO- smetti di essere malvagio' l'

0

Ho risolto lo stesso problema, ma non era esattamente lo stesso. Ha richiesto il minimo no di spigoli nel grafico dopo la riduzione in modo tale che i vertici originariamente collegati siano ancora connessi e non vengano effettuate nuove connessioni. Come è chiaro, non dice di trovare il grafico ridotto ma quanti bordi ridondanti sono presenti. Questo problema può essere risolto in O (V + E). Il link alla spiegazione è https://codeforces.com/blog/entry/56326 . Ma penso di rendere il grafico in realtà, avrà un'elevata complessità rispetto a O (N)

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.