Ejemplo n.º 1
0
        public void CreateEmptyDirectedGraphAndAddVertices()
        {
            var graph = new DirectedGraph();

            Assert.AreEqual(0, graph.Vertices());
            Assert.AreEqual(0, graph.Edges());

            int vertex1id = graph.AddVertex();
            int vertex2id = graph.AddVertex();

            Assert.AreEqual(0, vertex1id);
            Assert.AreEqual(1, vertex2id);

            graph.AddEdge(0, 1);
            Assert.AreEqual(2, graph.Vertices());
            Assert.AreEqual(1, graph.Edges());
            Assert.IsTrue(graph.AdjacentVertices(0).Contains(1));
            Assert.IsFalse(graph.AdjacentVertices(1).Contains(0));

            // add the same edge again
            graph.AddEdge(1, 0);
            Assert.AreEqual(2, graph.Vertices());
            Assert.AreEqual(2, graph.Edges());
            Assert.IsTrue(graph.AdjacentVertices(0).Contains(1));
            Assert.IsTrue(graph.AdjacentVertices(1).Contains(0));
        }
Ejemplo n.º 2
0
        public void CreateDirectedGraphWithSelfLoops()
        {
            var graph = new DirectedGraph(1);

            Assert.AreEqual(1, graph.Vertices());
            Assert.AreEqual(0, graph.Edges());

            graph.AddEdge(0, 0);
            Assert.AreEqual(1, graph.Edges());
            Assert.IsTrue(graph.AdjacentVertices(0).Contains(0));
        }
Ejemplo n.º 3
0
        public void CreateDirectedGraph()
        {
            // a cube
            var graph = new DirectedGraph(4);

            graph.AddEdge(0, 1);
            graph.AddEdge(1, 2);
            graph.AddEdge(2, 3);
            graph.AddEdge(3, 0);

            Assert.AreEqual(4, graph.Vertices());
            Assert.AreEqual(4, graph.Edges());
            Assert.IsTrue(graph.AdjacentVertices(0).Contains(1));
            Assert.IsTrue(graph.AdjacentVertices(1).Contains(2));
            Assert.IsTrue(graph.AdjacentVertices(2).Contains(3));
            Assert.IsTrue(graph.AdjacentVertices(3).Contains(0));

            // no linkback
            Assert.IsFalse(graph.AdjacentVertices(0).Contains(3));
        }
Ejemplo n.º 4
0
        public List <List <int> > GetPossiblePaths <T, K>(DirectedGraph <T, K> graph)
        {
            var edges = graph.GetEdgeSet().ToList();
            var start = edges[0].GetFirst();

            var visited = new HashSet <T>();

            var stack = new Stack <T>();

            stack.Push(start);

            var previousVertexModulo   = graph.GetVertexModulo(start);
            var allPathsAsVertexKeys   = new List <List <int> >();
            var allPathsAsVertexValues = new List <List <int> >();
            var newPathToAdd           = new List <T>();

            while (stack.Count > 0)
            {
                var vertex = stack.Pop();

                if (visited.Contains(vertex))
                {
                    continue;
                }

                visited.Add(vertex);

                var adjacentVertices = graph.AdjacentVertices(vertex).ToList();
                previousVertexModulo = graph.GetVertexModulo(vertex);
                var deadEndCounter = 0;
                foreach (var neighbor in adjacentVertices)
                {
                    var neighborVertex = graph.GetVertexPair(neighbor);
                    var currentLevel   = graph.GetWeight(vertex, neighborVertex.Key).GetHashCode();

                    if (newPathToAdd.Count > currentLevel)
                    {
                        for (var i = newPathToAdd.Count + 1 - currentLevel; i > 0; i--)
                        {
                            newPathToAdd.RemoveAt(newPathToAdd.Count - i);
                        }
                    }

                    var neighborModulo = graph.GetVertexModulo(neighbor);

                    if (!visited.Contains(neighbor) && previousVertexModulo != neighborModulo)
                    {
                        stack.Push(neighbor);
                        if (!newPathToAdd.Contains(vertex))
                        {
                            newPathToAdd.Add(vertex);
                        }
                    }
                    else
                    {
                        deadEndCounter++;
                    }

                    if (deadEndCounter == 2)
                    {
                        visited.Remove(vertex);
                    }
                }

                if (adjacentVertices.Count != 0)
                {
                    continue;
                }

                if (allPathsAsVertexKeys.Count != 0 && newPathToAdd.Count == allPathsAsVertexKeys[0].Count)
                {
                    newPathToAdd.RemoveAt(newPathToAdd.Count - 1);
                }

                newPathToAdd.Add(vertex);
                allPathsAsVertexKeys.Add(newPathToAdd.ConvertAll(x => x.GetHashCode()).ToList());
                var newList = new List <int>();
                newPathToAdd.ForEach(x => newList.Add(graph.GetVertexPair(x).Value.GetHashCode()));
                allPathsAsVertexValues.Add(newList);
            }

            return(allPathsAsVertexValues);
        }