Trovare percorsi più brevi e più lunghi tra due vertici in un DAG


14

Dato un DAG non ponderato (grafico aciclico diretto) e due vertici e , è possibile trovare il percorso più breve e più lungo da a nel tempo polinomiale? Le lunghezze del percorso sono misurate dal numero di spigoli.D=(V,A)stst

Sono interessato a trovare la gamma di possibili lunghezze del percorso nel tempo polinomiale.

Ps., Questa domanda è un duplicato della domanda StackOverflow Percorso più lungo in un DAG .

Risposte:


10

Per il problema del percorso più breve, se non ci preoccupiamo dei pesi, allora la prima ricerca dell'ampiezza è un modo infallibile. Altrimenti l'algoritmo di Dijkstra funziona fintanto che non ci sono fronti negativi.

Per il percorso più lungo, è sempre possibile eseguire Bellman-Ford sul grafico con tutti i pesi dei bordi annullati. Ricordiamo che Bellman-Ford funziona fintanto che non ci sono cicli di peso negativo e quindi funziona con qualsiasi peso su un DAG.


2
Bellman-Ford è un algoritmo di programmazione dinamica.
Raffaello

1
@Raphael sì, ma penso che ci sia un algoritmo DP diretto per trovare il percorso massimo, invece di negare tutti i pesi dei bordi.
jmite,

1
@jmite: Perché, ovviamente: basta cambiare Bellman-Ford per fare la conversione online, o massimizzare, o ...
Raffaello

1
A proposito, non sono intuitivamente convinto che il problema NP-completo Longest Path sia così facilmente in P su DAG. Gradirei una prova / riferimento / spiegazione.
Raffaello

2
Inoltre esiste un algoritmo DP più semplice ed efficiente per DAG

8

Sia e m = | E ( G ) | . Lascia che w ( a b ) denoti il ​​peso del bordo ( a b ) . Supponiamo di voler trovare il costo minimo e massimo del percorso da s a t .n=|V(G)|m=|E(G)|w(ab)(ab)st

A partire da , eseguire le seguenti operazioni:b:=t

  1. Se è già stato visitato, restituisce i valori min ( b ) e max ( b ) già calcolati . Altrimenti segna b come visitato.Bmin(B)max(B)B

  2. Determinare e registrare e max ( b ) come segue.min(B)max(B)

    • Se , memorizzare min ( s ) : = max ( s ) : = 0 .B=Smin(S): =max(S): =0
    • Altro set ignorando i vertici per i qualimin(a)=max(a)=inaccessible. Quando si calcola il minimo e il massimo su un set di spigoli vuoto (nessun spigolo in entrata perb, o tutto ignorato), impostaremin(b)
      min(B): =minun'B[w(un'B)+min(un')]max(B): =maxun'B[w(un'B)+max(un')]
      min(a)=max(a)=inaccessibleb .min(b):=max(b):=inaccessible

Dovresti essere in grado di dimostrare che questo algoritmo viene eseguito nel tempo , trascurando il tempo necessario per inizializzare tutte le variabili del vertice.O(m)


Questo approccio "pull" ricorsivo potrebbe essere effettivamente più lento del solito approccio dinamico "push" e ha bisogno di una pila di dimensioni lineari per gestire la ricorsione. L'approccio usuale è prendere i vertici in un ordine topologico e migliorare il minimo e il massimo provvisori per ciascun vicino del nodo corrente. Il nodo corrente ha sempre il valore finale di minimo e massimo poiché tutti i bordi in entrata devono essere già stati utilizzati per migliorarli.
Palec,
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.