2015-09-22 17 views
5

Dato un grafo non orientato ponderato G e due nodi U, V per ottenere il percorso più breve. Come posso ottenere il percorso più breve da U a V che utilizza un numero pari di spigoli (se possibile per ottenerlo)?Percorso più breve con numero pari di spigoli

Ho trovato alcuni articoli sul web che dicono che è necessaria una modifica sul grafico originale. Ma non riesco a capire come farlo.

C'è qualche buon materiale da studiare su questo problema?

+0

Questa domanda si adatterebbe meglio nello stack di informatica. – Untitled

risposta

2

Avrete bisogno di costruire un grafico intermedio ed eseguire Dijkstra su quel grafico.

Dato un grafo G = (V, E), creare un nuovo grafico G' = (V', E'), con V' un nuovo insieme di vertici v_even e v_odd per ogni vertice v in V e E' l'insieme di vertici come segue: Se (u, v) è un vantaggio in G, allora (u_odd, v_even) e (u_even, v_odd) sono spigoli in G', con lo stesso peso.

Ovviamente, il nuovo grafico ha il doppio dei bordi e dei vertici del grafico originale.

Ora, se si voleva trovare il percorso più breve tra s e t in G, basta eseguire Dijkstra di su G' per trovare il percorso più breve tra s_even e t_even.

Il tempo di esecuzione è ancora O(|V| log |E|).

+0

Questo ti darà la camminata anche più breve, non il percorso più corto. Anche se ciò che si trova usando l'algoritmo di Dijkstra è un percorso, quando si uniscono i bordi "gemelli", potrebbe diventare una scia o addirittura una passeggiata. Come controesempio, prendi il grafico ottenuto dall'unione disgiunta di un triangolo e un percorso di lunghezza 3, e quindi identifica un vertice di triangolo con un vertice interno del percorso. – Untitled

+0

@Un titolo se capisco correttamente la tua argomentazione: il mio approccio non è corretto perché un modo per trasformare una camminata di lunghezza dispari in una camminata di lunghezza pari consiste nel fare un giro completo su un ciclo di lunghezza dispari. Hai ragione, questo è un valido contro esempio che questo approccio non funziona in generale. –

0

Che dire di eseguire Dijkstra in cui ogni nodo ha due valori. Uno è strano (proveniente da un valore pari) e l'altro è pari valore.

+1

Dijkstra's è un algoritmo avido. Non è possibile memorizzare entrambi i valori nello stesso nodo perché verrà visitato solo una volta e il valore pari potrebbe essere molto diverso dal valore dispari. –

+0

In alternativa, è possibile creare un nuovo grafico con due tipi di nodi in cui è possibile che ogni nodo dispari punti a nodo pari e viceversa. In questo modo non si modifica Dijkstra (stavo pensando) ma grafico. –

+1

Questo ti darà una passeggiata, non un percorso. Per favore, vedi il mio commento sulla risposta di Vincent. – Untitled

0
  1. Crea una copia del tuo grafico con gli stessi pesi e chiamala G '.
  2. Collegare ogni vertice di G al vertice corrispondente in G 'e impostare a zero il peso dei nuovi bordi.
  3. Elimina la copia di u da G 'ed elimina v da G.
  4. Ora, l'insieme di spigoli aggiunti tra G e G' costituisce un M. corrispondente. Prendi la corrispondenza e trova un percorso di conversione minimo per quella corrispondenza.

Tale percorso deve avere come uno dei suoi punti finali e copia di v come l'altro endpoint, poiché sono gli unici vertici scoperti. Se si uniscono le copie e si eliminano i bordi aggiunti, il percorso trovato corrisponde a un percorso uniforme, poiché inizia da una copia e termina su un'altra. Inoltre, ogni percorso pari corrisponde a un percorso aumentante (per lo stesso argomento), quindi il minimo di uno è anche il minimo dell'altro. Questo è spiegato in here.

+0

Puoi postare un link su un documento liberamente accessibile? –

+0

@LukaRahne Scusa Luka. Non sono riuscito a trovarne uno. Immagino che se chiedi agli autori ti concederebbero l'accesso. Forse prova a richiederli attraverso la pagina ResearchGate di questo articolo. – Untitled

Problemi correlati