Nel seguente esercizio non capisco perché dobbiamo ordinare topologicamente i vertici...
Sei in piedi sulla cima della montagna. Dato che la salita è stata piuttosto dura, vuoi pianificare attentamente la tua sciata in modo da massimizzare la tua esperienza. Per aiutarti hai una mappa con tutti i punti di vista eccellenti pesati in base alla loro bellezza: più alto è il numero, migliore è la vista.
La tua posizione di partenza è etichettata s e devi terminare la tua discesa a t dove hai parcheggiato la macchina. Questo significa che potresti non riuscire a visitare tutti i punti di vista.
Input: un grafo aciclico diretto \(G=(V,E) \) con vertici pesati \(w : V \to \mathbb{R} \),, una fonte \(s \in V \) e un lavandino \(t \in V \).
Output: Il peso massimo di un percorso da \(s\) a \(t\), dove il peso di un percorso è la somma dei pesi dei suoi vertici.
Il tuo compito è quello di progettare e analizzare un algoritmo per il problema che runna in tempo \( O(\left| V \right| + \left| E \right| ) \).
Le soluzioni dicono questo:
Come primo step trasformiamo il nostro grafo con pesi sui vertici in un grafo con archi pesati, per fare questo definiamo \( w_1 : E \to \mathbb{R} \) tale che \( w_1(s,v)=w(s)+w(v) \) e \( w_1(u,v)=w(v) \) se \(u \neq s \). Sia \(m(u) \) il peso massimo di un percorso che inizia in \(s\) e termina in \(u\). Chiaramente \(m(s)=0\). Abbiamo la seguente formula ricorsiva
\[ m(u)= \max_{(v,u) \in E}\{ m(v) + w_1(v,u) \}, u \neq s \]
Per calcolare efficientemente \(m(u) \) dobbiamo aver già calcolato \(m(v) \) per ogni vertice con archi che arrivano in \(u\). A tal fine continuiamo ordinando topologicamente i vertici. Per fare ciò associamo ad ogni vertice un numero da \(1\) ad \(n\) che descrive la posizione del vertice in ordine topologico. Per rendere la descrizione più semplice diciamo che \(p : \{1,\ldots,n\} \to V \) è la funzione che descrive la posizione dei vertici. Infine usiamo l'approccio bottom up per calcolare \(m(t)\). Notando che l'ordinamento topologico può essere eseguito in tempo lineare \( O(\left| V \right| + \left| E \right| ) \) e che il loop della programmazione dinamica usa al massimo \( \left| E \right| \) comparazioni otteniamo in totale una complessità di esecuzione uguale a \( O(\left| V \right| + \left| E \right| ) \).