Sottografo contenente tutti i nodi e gli spigoli che fanno parte di percorsi st semplici limitati in lunghezza in un grafico non orientato


12

Abbastanza simile alla mia domanda precedentemente pubblicata . Questa volta, tuttavia, il grafico non viene indirizzato.

Dato

  • Un grafico non orientato senza bordi multipli o anelli,G
  • Un vertice sorgente ,s
  • Un vertice bersaglio ,t
  • Lunghezza massima del percorso ,l

Sto cercando - Un sottografo di G che contiene qualsiasi vertice e qualsiasi bordo in G (e solo quelli), che fanno parte di almeno un percorso semplice da s a t con lunghezza l .GGGstl

Appunti:

  • Non ho bisogno di enumerare i percorsi.
  • Sto cercando un algoritmo efficiente (sia tempo che memoria), poiché ho bisogno di eseguirlo su grafici molto grandi (10 ^ 8 vertici, 10 ^ 9 spigoli).

controllalo. Ho trovato questo documento, che sembra fare una simile riduzione del flusso di costo minimo, ma utilizza le caratteristiche speciali della rete per risolverlo più velocemente degli algoritmi MCF generali.
RB

Risposte:


6

Bene, il problema è in dopo tutto. Manterrò la risposta precedente poiché funziona anche per il caso diretto (che è NPC, come risposta sull'altra domanda), e mostra che è F P T rispetto a l .PFPTl

Nel caso non indirizzato, è risolvibile, in modo deterministico tramite il flusso di costo minimo (ciò potrebbe non funzionare sulle scale a cui si fa riferimento nella domanda, ma è meglio dell'algoritmo esponenziale.

La seguente procedura deciderà se parte del bordo deve far parte del grafico di output. Per rispondere al problema originale basta passare su tutti i bordi.e=(u,v)E

Per creare la rete di flusso, procedere come segue:

Passaggio 1: espandi per avere un vertice xe e sostituisci e con i bordi ( u , x e ) , ( x e , u ) , ( v , x e ) , ( x e , v ) (sono diretti come parte della rete di flusso), impostare il loro costo su 0.exee(u,xe),(xe,u),(v,xe),(xe,v)

Fase 2: sostituire ogni vertice , fatta eccezione per x e da due vertici t - e t + , e aggiungere un bordo ( t - , t + ) . Imposta il costo di questi bordi su 1.txett+(t,t+)

Passaggio 3: sostituire ogni bordo con i bordi ( a + , b - ) , ( b + , a - ) . Impostare il costo di questi bordi su 0.{a,b}E(a+,b),(b+,a)

Passaggio 4: aggiungere un nuovo vertice aggiungere i bordi ( s , y e ) , ( t , y e ) con costo 0.ye(s,ye),(t,ye)

Passaggio 5: impostare tutte le capacità su 1.

Ora eseguire l'algoritmo di flusso min costo, alla ricerca di un flusso di valore di 2 da al y e .xeye


Analisi:

  • xeyexesyexetye
  • I percorsi sono disgiunti, poiché per ogni vertice esiste solo 1 capacità nell'arco .( t - , t + )t(t,t+)
  • I percorsi restituiti sono i due percorsi la cui somma delle distanze è minima e questo è anche il costo del flusso trovato. Questo ci consente di aggiungere al grafico di output o di eliminare in altro modo.e

1
È più facile comprendere l'argomento nella risposta sopra eliminando la riduzione al flusso diretto. C'è un cammino semplice da a contenente un nodo sse esiste un percorso da a e un percorso da a tale che e sono disgiunti nodo se non a . Questo utilizza in modo cruciale il non indiretto. Questo può essere verificato tramite flusso e la versione di costo può essere eseguita anche tramite flusso di costo minimo. Si può verificare se esiste un percorso semplice da a contenentet v P v s Q v t P Q v s t e estvPvsQvtPQvsteintroducendo un nodo nel mezzo di . e
Chandra Chekuri,

@ChandraChekuri - è corretto, ma tieni presente che se il problema non ha il limite di lunghezza, c'è un algoritmo molto più semplice per decidere - vedi qui
RB

Certo, sono consapevole anche di quella soluzione - concettualmente è bene capire i componenti biconnessi tramite percorsi disgiunti anche se si possono trovare vertici di taglio e componenti biconnessi direttamente tramite DFS.
Chandra Chekuri,

@RB: grazie. L'algorihm suggerito può essere efficace quando l è relativamente grande, ma è probabilmente non ottimale per valori relativamente piccoli di l. Immagino di poter tagliare G prima rimuovendo qualsiasi vertice più lontano del pavimento (l / 2) da seil ceil (l / 2) da t.
Lior Kogan,

1
Prova ad adattare l'algoritmo del percorso più breve successivo (chiamato anche algoritmo di Surballe per il caso di 2 percorsi che qui è interessante). Volete trovare 2 percorsi più brevi da (è meglio chiamarlo invece di poiché è lo stesso per tutti i bordi) per ogni . Penso che questo sia fattibile in modo efficiente prima calcolando un albero di percorso più breve da e quindi implementando il calcolo del secondo percorso con una certa attenzione. y y e x e yyyyexey
Chandra Chekuri,

1

Ecco una risposta sbagliata : genera alcuni vertici che fanno parte di percorsi non semplici da a e che non fanno parte di alcun percorso semplice da a di lunghezza . La risposta potrebbe essere ancora rilevante per l'applicazione del richiedente, quindi la lascio qui.t s t stst

Ecco un algoritmo che gira nel tempo (e in realtà è più veloce di questo quando è piccolo).O(|V|+|E|)

L'algoritmo esegue una ricerca BFS da che termina in profondità . Questo BFS fornisce un insieme di tutti i vertici raggiungibili da con un percorso di lunghezza al massimo , e calcola anche le distanze per ogni . Quindi farei lo stesso da e l'insieme e le distanze da . Infine, i vertici che stai cercando sono esattamente . I bordi sono esattamente quelli in (sVssdist(s,v)vVstVttVsolution={v:vVsVt,dist(s,v)+dist(t,v)}E[Vsolution]=(v,u)E:u,vVsolution).

Il tempo di esecuzione di questo algoritmo è sicuramente perché esegue solo due BFS. Ma il tempo di esecuzione è in realtà che sarà molto più piccolo della dimensione del grafico quando i quartieri -radius di e sono piccoli.O(|V|+|E|)O(|Vs|+|Vt|+|E[Vs]|+|E[Vt]|)st

Edit: probabilmente c'è un algoritmo po 'più veloce, in pratica, che fa un BFS da e della profondità soltanto piuttosto che . Questo scopre tutti i percorsi e quindi con un po 'di contabilità puoi trovare tutti i vertici. Questo riduce il tempo di esecuzione di una radice quadrata per il caso di un grande grafico dall'aspetto casuale quando è piccolo.st/2


3
Questo non obbliga il percorso ad essere semplice. Considera il semplice percorso grafico e . Restituirai come parte dell'output, anche se non esiste un semplice percorso st che attraversa ...tusvxl=4vv
RB

Grazie per la correzione @RB. Ho modificato la mia risposta per notare che è sbagliato.
gnocco di mobius

1

Questo è inteso come commento, ma è troppo lungo per essere pubblicato come commento.

Potresti anche essere interessato a chiavi grafiche o emulatori per i tuoi scopi. Una chiave di un grafico è un sottografo con pochi spigoli, ma distanze approssimativamente conservate. Un emulatore è un grafico cui bordi possono essere ponderati.H = ( V , E ) H = ( V , E , w )G=(V,E)H=(V,E)H=(V,E,w)

Il miglior risultato per le chiavi è e un errore additivo di +6 sulle stime della distanza nel grafico. Il risultato migliore per gli emulatori è i bordi e un errore aggiuntivo di +4. Non è noto nemmeno se si può battere , anche se si può consentire che l'errore sia pollogaritmico.O ( n 4 / 3 ) O ( n 4 / 3 )O(n4/3)O(n4/3)O(n4/3)

Se questo sembra utile, posso provare a scavare le costruzioni pertinenti per te.

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.