Questo algoritmo fa un grande lavoro di attraversamento dei nodi in un grafico.C# Graphlversal
Dictionary<Node, bool> visited = new Dictionary<Node, bool>();
Queue<Node> worklist = new Queue<Node>();
visited.Add(this, false);
worklist.Enqueue(this);
while (worklist.Count != 0)
{
Node node = worklist.Dequeue();
foreach (Node neighbor in node.Neighbors)
{
if (!visited.ContainsKey(neighbor))
{
visited.Add(neighbor, false);
worklist.Enqueue(neighbor);
}
}
}
posso usare questo per trovare un nodo di destinazione nel grafico. La lista di lavoro rimuove (o fa scomparire) gli elementi man mano che la lista di lavoro viene elaborata. Una volta trovato l'obiettivo, come posso restituire il percorso completo al nodo?
Aggiornamento Sto cercando di capire come invertire il percorso della radice. Il metodo viene chiamato sul nodo radice, dopo di che, i bambini possono avere due genitori, quindi non è così semplice come chiamare la proprietà genitore su ciascun nodo e attraversare il backup.
L'obiettivo del metodo è trovare il percorso, non per iterare tutti i nodi o controllare se esiste un nodo.
hai π.Add (neighbor, visited); e il valore del dizionario π è un nodo, cosa stai inseguendo nel valore? – blu
Il predecessore. Il dizionario qui in realtà agisce come una funzione: per un valore di input n, fornire il nodo predecessore. L'input è la chiave, il valore restituito è il valore. –
Non sarebbe π.Add (vicino, nodo) ;? Il concetto suona bene, ma il codice non è valido, penso che sia un errore di battitura. – blu