public static IEnumerable <IDAGNode <T> > GetAccessibleNodes <T>(this IDAGNode <T> root) { Queue <IDAGNode <T> > queue = new Queue <IDAGNode <T> >(); queue.Enqueue(root); while (queue.Count > 0) { var node = queue.Dequeue(); foreach (var dest in node.Destinations) { queue.Enqueue((IDAGNode <T>)dest); } yield return(node); } }
public static IDAGNode BFS(this IDAGNode origin, Func <IDAGNode, bool> match) { Queue <IDAGNode> queue = new Queue <IDAGNode>(); queue.Enqueue(origin); while (queue.Count > 0) { var node = queue.Dequeue(); if (match(node)) { return(node); } foreach (var dest in node.Destinations) { queue.Enqueue(dest); } } return(null); }
public static IDAGNode DFS(this IDAGNode origin, Func <IDAGNode, bool> match) { Stack <IDAGNode> stack = new Stack <IDAGNode>(); stack.Push(origin); while (stack.Count > 0) { var node = stack.Pop(); if (match(node)) { return(node); } foreach (var dest in node.Destinations) { stack.Push(dest); } } return(null); }
public static bool CanReach(this IDAGNode origin, IDAGNode dest) { return(origin.BFS(dest.Equals) != null); }