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)); }
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)); }
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)); }
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); }