示例#1
0
        public void MergedPath_Throws()
        {
            // ReSharper disable ReturnValueOfPureMethodIsNotUsed
            // ReSharper disable AssignNullToNotNullAttribute
            var recorder = new EdgePredecessorRecorderObserver <int, Edge <int> >();

            Assert.Throws <ArgumentNullException>(
                () => recorder.MergedPath(null, new Dictionary <Edge <int>, GraphColor>()));
            Assert.Throws <ArgumentNullException>(
                () => recorder.MergedPath(new Edge <int>(1, 2), null));
            Assert.Throws <ArgumentNullException>(
                () => recorder.MergedPath(null, null));
            // ReSharper restore AssignNullToNotNullAttribute

            var edge = new Edge <int>(1, 2);

            Assert.Throws <KeyNotFoundException>(
                () => recorder.MergedPath(edge, new Dictionary <Edge <int>, GraphColor>()));
            // ReSharper restore ReturnValueOfPureMethodIsNotUsed
        }
示例#2
0
        public void MergedPath()
        {
            {
                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();

                    var edge12 = new Edge <int>(1, 2);
                    var colors = new Dictionary <Edge <int>, GraphColor>
                    {
                        [edge12] = GraphColor.Black
                    };

                    // Not in the graph and edge marked as already used!
                    CollectionAssert.IsEmpty(recorder.MergedPath(edge12, colors));

                    // Not in the graph => return the edge itself
                    colors[edge12] = GraphColor.White;
                    CollectionAssert.AreEqual(
                        new[] { edge12 },
                        recorder.MergedPath(edge12, colors));
                }
            }

            {
                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();

                    Dictionary <Edge <int>, GraphColor> colors = graph.Edges.ToDictionary(
                        edge => edge,
                        _ => GraphColor.White);

                    CollectionAssert.AreEqual(
                        new[] { edge12, edge24 },
                        recorder.MergedPath(edge24, colors));

                    // Already used
                    CollectionAssert.IsEmpty(recorder.MergedPath(edge24, colors));

                    CollectionAssert.AreEqual(
                        new[] { edge13, edge31 },
                        recorder.MergedPath(edge31, colors));
                }
            }

            {
                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();

                    Dictionary <Edge <int>, GraphColor> colors = graph.Edges.ToDictionary(
                        edge => edge,
                        _ => GraphColor.White);

                    CollectionAssert.AreEqual(
                        new[] { edge12, edge24, edge41 },
                        recorder.MergedPath(edge41, colors));

                    // Already used
                    CollectionAssert.IsEmpty(recorder.MergedPath(edge41, colors));

                    CollectionAssert.AreEqual(
                        new[] { edge13, edge33, edge34 },
                        recorder.MergedPath(edge34, colors));
                }
            }
        }