예제 #1
0
        public static List <IEnumerable <TaggedEdge <string, string> > > GetPaths(AdjacencyGraph <string, TaggedEdge <string, string> > g)
        {
            var dfs      = new EdgeDepthFirstSearchAlgorithm <string, TaggedEdge <string, string> >(g);
            var recorder = new EdgePredecessorRecorderObserver <string, TaggedEdge <string, string> >();

            List <IEnumerable <TaggedEdge <string, string> > > results = new List <IEnumerable <TaggedEdge <string, string> > >();

            using (recorder.Attach(dfs))
            {
                dfs.Compute();
                var paths = recorder.AllPaths();
                foreach (var p in paths)
                {
                    results.Add(p);
                }
            }
            return(results);
        }
예제 #2
0
        public void AllPaths()
        {
            {
                var recorder = new EdgePredecessorRecorderObserver <int, Edge <int> >();

                var graph = new AdjacencyGraph <int, Edge <int> >();

                var dfs = new EdgeDepthFirstSearchAlgorithm <int, Edge <int> >(graph);
                using (recorder.Attach(dfs))
                {
                    dfs.Compute();

                    CollectionAssert.IsEmpty(recorder.AllPaths());
                }
            }

            {
                var recorder = new EdgePredecessorRecorderObserver <int, Edge <int> >();

                // Graph without cycle
                var edge12 = new Edge <int>(1, 2);
                var edge13 = new Edge <int>(1, 3);
                var edge14 = new Edge <int>(1, 4);
                var edge24 = new Edge <int>(2, 4);
                var edge31 = new Edge <int>(3, 1);
                var edge33 = new Edge <int>(3, 3);
                var edge34 = new Edge <int>(3, 4);
                var graph  = new AdjacencyGraph <int, Edge <int> >();
                graph.AddVerticesAndEdgeRange(new[]
                {
                    edge12, edge13, edge14, edge24, edge31, edge33, edge34
                });

                var dfs = new EdgeDepthFirstSearchAlgorithm <int, Edge <int> >(graph);
                using (recorder.Attach(dfs))
                {
                    dfs.Compute();

                    CollectionAssert.AreEquivalent(
                        new IEnumerable <Edge <int> >[]
                    {
                        new[] { edge12, edge24 },
                        new[] { edge13, edge31, edge14 },
                        new[] { edge13, edge33, edge34 }
                    },
                        recorder.AllPaths());
                }
            }

            {
                var recorder = new EdgePredecessorRecorderObserver <int, Edge <int> >();

                // Graph with cycle
                var edge12 = new Edge <int>(1, 2);
                var edge13 = new Edge <int>(1, 3);
                var edge14 = new Edge <int>(1, 4);
                var edge24 = new Edge <int>(2, 4);
                var edge31 = new Edge <int>(3, 1);
                var edge33 = new Edge <int>(3, 3);
                var edge34 = new Edge <int>(3, 4);
                var edge41 = new Edge <int>(4, 1);
                var graph  = new AdjacencyGraph <int, Edge <int> >();
                graph.AddVerticesAndEdgeRange(new[]
                {
                    edge12, edge13, edge14, edge24, edge31, edge33, edge34, edge41
                });

                var dfs = new EdgeDepthFirstSearchAlgorithm <int, Edge <int> >(graph);
                using (recorder.Attach(dfs))
                {
                    dfs.Compute();

                    CollectionAssert.AreEquivalent(
                        new IEnumerable <Edge <int> >[]
                    {
                        new[] { edge12, edge24, edge41, edge13, edge31, edge14 },
                        new[] { edge12, edge24, edge41, edge13, edge33, edge34 }
                    },
                        recorder.AllPaths());
                }
            }
        }