Graph traversal algorithms: BFS, DFS. Commonly used types: • Adjacency.EnumerableBfs<TVertex, TNeighborEnumerator> • Adjacency.EnumerableDfs<TVertex, TNeighborEnumerator> • Adjacency.EnumerableGenericSearch<TVertex, TNeighborEnumerator> • Adjacency.EagerBfs<TVertex, TNeighborEnumerator> • Adjacency.EagerDfs<TVertex, TNeighborEnumerator> • Incidence.EnumerableBfs<TVertex, TEdge, TEdgeEnumerator> • Incidence.EnumerableDfs<TVertex, TEdge, TEdgeEnumerator> • Incidence.EnumerableGenericSearch<TVertex, TEdge, TEdgeEnumerator> • Incidence.EagerBfs<TVertex, TEdge, TEdgeEnumerator> • Incidence.EagerDfs<TVertex, TEdge, TEdgeEnumerator>
$ dotnet add package Arborescence.TraversalThis package provides basic traversal algorithms for incidence and adjacency graphs:
Let's consider this implicit adjacency graph2:
public readonly record struct Node(int Value);
public sealed class AdjacencyGraph : IOutNeighborsAdjacency<Node, IEnumerator<Node>>
{
public IEnumerator<Node> EnumerateOutNeighbors(Node vertex) =>
vertex.Value is < 0 or >= 10
? Enumerable.Empty<Node>().GetEnumerator()
: EnumerateNeighborsIterator(vertex);
private static IEnumerator<Node> EnumerateNeighborsIterator(
Node vertex)
{
yield return new(vertex.Value >> 1);
yield return new(vertex.Value << 1);
}
}
This is how to traverse it in a breadth-first manner with an adjacency version of the algorithm:
AdjacencyGraph adjacencyGraph = new();
Node source = new(3);
IEnumerator<Node> vertexEnumerator =
EnumerableBfs<Node>.EnumerateVertices(adjacencyGraph, source);
while (vertexEnumerator.MoveNext())
Console.WriteLine(vertexEnumerator.Current);
Stack-based graph traversal ≠ depth first search
https://11011110.github.io/blog/2013/12/17/stack-based-graph-traversal.html
Implicit graph
https://en.wikipedia.org/wiki/Implicit_graph ↩