private static IEnumerable <TVertex> BreadthFirstSearch <TVertex, TEdge>(IList <TVertex> todo, IDirectedMultigraph <TVertex, TEdge> graph, IList <TVertex> verticesLeft) { while (todo.Count > 0) { yield return(todo[0]); foreach (var neighbor in graph.GetNeighbors(todo[0])) { if (verticesLeft.Contains(neighbor)) { yield return(neighbor); todo.Add(neighbor); verticesLeft.Remove(neighbor); } } todo.RemoveAt(0); } }
public static IEnumerable <IEnumerable <TVertex> > ConnectedComponents <TVertex, TEdge>(this IDirectedMultigraph <TVertex, TEdge> graph) { var todo = new List <TVertex>(); var verticesLeft = new List <TVertex>(graph.Vertices); while (verticesLeft.Count > 0) { todo.Add(verticesLeft[0]); verticesLeft.RemoveAt(0); yield return(BreadthFirstSearch(todo, graph, verticesLeft)); } }