Scegli una rappresentazione dei dati
Innanzitutto, guarda le dimensioni del risultato. Volete la raccolta dei percorsi più brevi da verso ogni altro nodo. A meno che la lunghezza media di un percorso non sia delimitata da una costante (cosa che non lo è: qualsiasi elenco è unipath e se si prende la radice per la lunghezza totale dei percorsi è dove è la lunghezza dell'elenco), dovrai fare attenzione nella rappresentazione dei dati: la struttura contenente i percorsi dovrà utilizzare la condivisione tra i percorsi.s n ( n - 1 ) / 2 nssn(n−1)/2n
Escludendo i cicli, esiste un singolo percorso da a qualsiasi altro nodo . Se quel percorso attraversa un nodo intermedio , il primo segmento del percorso è il percorso desiderato da a . u t s tsutst
Propongo di archiviare il risultato in un array, indicizzato da nodi numerati da a , con . Ogni elemento dell'array memorizza l'indice del nodo precedente sul percorso di quel nodo (utilizzare ad esempio come marcatore speciale per nodi che non sono raggiungibili da ). Il percorso da a sarà .| E | - 1 s = 0 - 1 s s t ( s = R [ … R [ t ] … ] , … , R [ R [ t ] ] , R [ t ] , t )0|E|−1s=0−1sst(s=R[…R[t]…],…,R[R[t]],R[t],t)
Attraversa il grafico
Inizializza su tutto .- 1R−1
Esegui un attraversamento in profondità del primo o dell'ampiezza del grafico a partire da . Ogni volta che viene raggiunto un nodo , impostare sul suo predecessore.u R [ u ]suR[u]
Poiché ci sono cicli, un nodo potrebbe essere raggiunto più di una volta. Avere indica che già stato visitato.uR[u]≠−1u
Dimostrare la correttezza
A causa della proprietà unipatica, non importa come raggiungiamo ciascun nodo, purché non abbiamo completato un ciclo. C'è solo un percorso semplice.
Dimostrare la complessità
L'algoritmo può raggiungere ciascun nodo più di una volta, quindi non è chiaro che la sua complessità sia . Il lavoro svolto è in effetti dove sono i bordi che sono raggiungibili dalla sorgente. Più precisamente, raggiungiamo un nodo più di una volta solo in una circostanza: se il nodo è il primo che raggiungiamo in un determinato ciclo, e in questo caso lo raggiungiamo due volte (una volta da un percorso semplice e una volta dopo aver completato il ciclo ).Θ ( | E 0 | ) V 0O(|V|)Θ(|E0|)V0
Bene allora. Dimostriamo che in un grafico unipatico, il numero di cicli elementari cresce al massimo linearmente con il numero di nodi. (Un ciclo elementare è uno che non contiene un ciclo più breve.) Nella discussione che segue, assumerò che il grafico non abbia un auto-bordo (nessun bordo da un nodo a se stesso; tali bordi sono comunque irrilevanti per la costruzione del percorso ).
I grafici unipatici possono avere cicli, ma in modo molto limitato. Sarebbe bello se potessimo in qualche modo associare ciascun ciclo a un nodo distinto (o almeno, al massimo un numero limitato di cicli per nodo). I cicli possono condividere un nodo? Sfortunatamente sì.
Puoi avere cicli tutti condividendo un nodo e nessun altro nodo. Il grafico risultante è unipatico. Con cicli di lunghezza 2, questo è un motivo a stella con un nodo centrale e un numero qualsiasi di nodi tale che .a a b i ∀ i , a ⇆ b imaabi∀i,a⇆bi
Quindi dovremo lavorare di più. Bene, proviamo a dimostrarlo induttivamente. Sia il numero di nodi in un grafico , il numero di spigoli e il numero di cicli elementari che non sono spigoli automatici. Affermo che se è unipatico e non vuoto, allora .G # E ( G ) # C ( G ) G # C ( G ) ≤ # V ( G ) - 1#V(G)G#E(G)#C(G)G#C(G)≤#V(G)−1
Per un grafico con uno o due nodi, questo è ovvio. Supponiamo che l'affermazione valga per tutti i grafici in modo che e che sia un grafico unipatico con nodi. Se non ha ciclo, , caso chiuso. Altrimenti, sia un ciclo elementare.#V(G)<nn G 0 = # C ( G ) < # V ( G ) ( a 1 , … , a m )GnG0=#C(G)<#V(G)(a1,…,am)
Comprimi il ciclo: lascia che sia il grafico i cui nodi sono quelli di meno più un nodo e i cui bordi sono tutti i bordi di non coinvolgono gli , più ogni volta che e ogni volta che . Ogni percorso in induce un percorso in (se il percorso comporta , quindi sostituirlo conG′G{a1,…,am}G a i a → G ′ b ∃ i , a i → G b b → G ′ a ∃ i , b → G a i G ′ G b → a → c b → a i → a i + 1 → …aGaia→G′b∃i,ai→Gbb→G′a∃i,b→GaiG′Gb→a→cG G ′ G G ′b→ai→ai+1→…→aj→c in ). Pertanto è unipatico. Inoltre, poiché i cicli in non condividono i bordi, ha tutti i cicli in tranne quello che abbiamo eliminato: . Per induzione, . Poiché , abbiamo .GG′GG′G#C(G′)=#C(G)−1#C(G′)≤#V(G′)−1#V(G′)=#V(G)−m+1#C(G)=#C(G′)+1≤#V(G)−m=n−m≤n−1
Questo conclude la prova. L'incrocio segue al massimo spigoli.2|V|−2