Si vous avez une classe GraphNode qui ressemble à ceci:
public class GraphNode
{
public IEnumerable<GraphNode> Children { get; set; }
// ...
}
Alors ce Sould faire le travail:
public static class GraphPathFinder
{
public static IEnumerable<IEnumerable<GraphNode>> FindAllPathsTo(this GraphNode startNode, GraphNode endNode)
{
List<IEnumerable<GraphNode>> results = new List<IEnumerable<GraphNode>>();
Stack<GraphNode> currentPath = new Stack<GraphNode>();
currentPath.Push(startNode);
FindAllPathsRecursive(endNode, currentPath, results);
return results;
}
private static void FindAllPathsRecursive(GraphNode endNode, Stack<GraphNode> currentPath, List<IEnumerable<GraphNode>> results)
{
if (currentPath.Peek() == endNode) results.Add(currentPath.ToList());
else
{
foreach (GraphNode node in currentPath.Peek().Children.Where(p => !currentPath.Contains(p)))
{
currentPath.Push(node);
FindAllPathsRecursive(endNode, currentPath, new List<IEnumerable<GraphNode>>());
currentPath.Pop();
}
}
}
}
Il est une implémentation simple de l'algorithme DFS. Aucune vérification d'erreur, optimisations, thread-sécurité, etc ...
Aussi si vous êtes sûr que votre graphique ne fonctionne pas, vous pouvez supprimer la clause where dans l'instruction foreach dans la dernière méthode.
J'espère que cela a aidé.
tous les chemins de chaque nœud à chaque nœud ou du début à la fin? et y a-t-il des cycles? – palindrom
Vous allez devoir donner plus d'informations. Qu'est-ce qui est autorisé, et qu'est-ce qui n'est pas autorisé? Comme demandé auparavant, les cycles sont-ils présents? –
Ce genre de question est mieux étiqueté comme [devoirs], si c'est ce que c'est. En fait, je m'attendais plutôt à ce qu'un modérateur l'ait déjà marqué. –