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.txet−t+(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:
- xeyexe⇝s→yexe⇝t→ye
- 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