Piuttosto che fare questo problema i compiti per te, ho intenzione di chiedere l'utente attraverso il processo di pensiero che ottiene la risposta ...
1) Cosa faresti con l'abc grafico (a tre vertici, due bordi e decisamente aciclici)? Immagina per un momento che devi mettere alcune etichette su alcuni dei vertici, sai che otterrai il minimo del percorso più lungo sul vertice "centrale". (b, con l'eventuale etichetta "1") Ma farlo in un solo passo richiede poteri psichici. Quindi chiediti cosa è a 1 passo da. Se il percorso più lungo per b è 1, e abbiamo appena fatto un passo indietro lungo quel percorso, qual è la lunghezza del nostro percorso finora? (percorso più lungo = 1, -1 per il gradino posteriore. Aha: 0). Quindi deve essere l'etichetta per le foglie.
2) Cosa suggerisce questo come primo taglio per un algoritmo? Segna le foglie "0", segna i loro upstream "1", segna i loro upstream "2" e così via. Marciamoci dalle foglie e contando la distanza mentre andiamo ...
3) Umm ... Abbiamo un problema con il grafico a-b-c-d. (D'ora in poi, un vertice etichettato verrà sostituito con la sua etichetta.) Etichettare le foglie "0" dà 0-bc-0 ... Non possiamo ottenere due centri ... diamine, che cosa facciamo nel più semplice condizione 0-b-1? Vogliamo etichettare b con entrambi "1" e "2" ... Gestire quelli in ordine inverso ...
In 0-b-1, se estendiamo il percorso da sinistra a sinistra di uno, otteniamo un percorso di lunghezza 1. Se estendiamo il percorso da b a destra, otteniamo 2. Vogliamo tracciare "la lunghezza del percorso più lungo da v a qualsiasi altro nodo", quindi vogliamo tenere traccia del percorso più lungo verso b. Ciò significa che contrassegniamo b con un "2".
0-b-1 -> 0-2-1
In 0-b-c-0, il computer non fa effettivamente simultaneamente b aggiornamento e c. Aggiorna uno di loro, dando 0-1-c-0 o 0-b-1-0, e il prossimo aggiornamento dà 0-1-2-0 o 0-2-1-0. Sia b che c sono "centri" di questo grafico poiché ognuno di essi soddisfa la domanda "il nodo v nell'albero che minimizza la lunghezza del percorso più lungo da v a qualsiasi altro nodo". (La lunghezza è 2.)
Questo porta a un'altra osservazione: il risultato del calcolo non è quello di etichettare un grafico, è quello di trovare l'ultimo vertice che etichettiamo e/o il vertice che finisce con l'etichetta più grande. (È possibile che non troveremo un buon modo per ordinare le etichette, quindi finiremo per dover trovare il massimo alla fine, o forse lo faremo. Chissà.)
4) Quindi ora abbiamo qualcosa come: Crea due copie del grafico: la copia etichettata e la copia di burn-down. Il primo memorizzerà le etichette ed è quello che avrà la risposta finale. La copia burn-down diventerà sempre più piccola man mano che eliminiamo i vertici non etichettati (per trovare nuovi vertici etichettabili). (Ci sono altri modi per organizzare questo in modo che solo una copia del grafico viene utilizzata quando si arriva alla fine di comprendere questa risposta, si dovrebbe trovare un modo per ridurre questo spreco..) Outline:
label = 0
while the burndown graph is nonempty
collect all the leaves in the burndown-graph into the set X
for each leaf in the set X
if the leaf does not have a label
set the leaf's label (to the current value of label)
delete the leaf from the burn-down graph (these leafs are two copies of the same leaf in the input graph)
label = label+1
find the vertex with the largest label and return it
5) Se guardi effettivamente questa corsa, noterai diverse opportunità per la scorciatoia. Compresa la sostituzione della ricerca sull'ultima riga del contorno con un metodo molto più rapido per riconoscere la risposta.
E ora per suggerimenti di strategia generale per problemi con l'algoritmo:
* Fai alcuni piccoli esempi a mano. Se non capisci come fare i casi piccoli, non c'è modo di entrare direttamente e dire al computer come fare i casi più grandi. * Se uno qualsiasi dei passaggi precedenti sembrava immotivato o totalmente opaco, è necessario studiare molto, molto più difficile da fare bene in Informatica. Può essere l'informatica non è per voi ...
Se il punto centrale esattamente non esiste, come potremmo scegliere? Voglio dire, se il modo più lungo è a-b-c, a-b ha lunghezza 1 e b-c ha lunghezza 2?O un esempio più complesso? – cnhk
Scegline uno arbitrariamente, se hai semplicemente bisogno di un nodo che si qualifica, o costruisci un set centrale, se hai bisogno di tutto ciò che si qualifica. – tvanfosson