コード例 #1
0
        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);
            }
        }
コード例 #2
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));
            }
        }