public void GraphKnowsTheIncomingAndOutgoingEdges() { var graph = new DiGraph <int, int>(1); graph.AddEdge(1, 1); graph.AddEdge(2, 2); graph.AddEdge(3, 3); graph.AddEdge(1, 2); graph.AddEdge(2, 1); graph.AddEdge(2, 3); graph.AddEdge(3, 2); graph.AddEdge(3, 1); graph.AddEdge(1, 3); CollectionAssert.AreEquivalent(new List <IEdge <int, int> > { new Edge <int, int>(1, 1, 1), new Edge <int, int>(2, 1, 1), new Edge <int, int>(3, 1, 1), }, graph.GetIncomingEdges(1)); CollectionAssert.AreEquivalent(new List <IEdge <int, int> > { new Edge <int, int>(1, 1, 1), new Edge <int, int>(1, 2, 1), new Edge <int, int>(1, 3, 1), }, graph.GetOutgoingEdges(1)); CollectionAssert.AreEquivalent(new List <IEdge <int, int> > { new Edge <int, int>(1, 2, 1), new Edge <int, int>(2, 2, 1), new Edge <int, int>(3, 2, 1), }, graph.GetIncomingEdges(2)); CollectionAssert.AreEquivalent(new List <IEdge <int, int> > { new Edge <int, int>(2, 1, 1), new Edge <int, int>(2, 2, 1), new Edge <int, int>(2, 3, 1), }, graph.GetOutgoingEdges(2)); CollectionAssert.AreEquivalent(new List <IEdge <int, int> > { new Edge <int, int>(1, 3, 1), new Edge <int, int>(2, 3, 1), new Edge <int, int>(3, 3, 1), }, graph.GetIncomingEdges(3)); CollectionAssert.AreEquivalent(new List <IEdge <int, int> > { new Edge <int, int>(3, 1, 1), new Edge <int, int>(3, 2, 1), new Edge <int, int>(3, 3, 1), }, graph.GetOutgoingEdges(3)); Assert.IsTrue(graph.HasEdge(3, 1)); Assert.IsFalse(graph.HasEdge(4, 2)); }
public void DiGraph_Smoke_Test() { var graph = new DiGraph <int>(); graph.AddVertex(1); graph.AddVertex(2); graph.AddVertex(3); graph.AddVertex(4); graph.AddVertex(5); graph.AddEdge(1, 2); Assert.IsTrue(graph.HasEdge(1, 2)); Assert.IsFalse(graph.HasEdge(2, 1)); graph.AddEdge(3, 2); Assert.AreEqual(2, graph.InEdges(2).Count()); graph.RemoveEdge(3, 2); graph.AddEdge(2, 3); graph.AddEdge(3, 4); graph.AddEdge(4, 5); graph.AddEdge(4, 1); graph.AddEdge(3, 5); Assert.AreEqual(2, graph.OutEdges(4).Count()); Assert.AreEqual(5, graph.VerticesCount); Assert.IsTrue(graph.HasEdge(1, 2)); graph.RemoveEdge(1, 2); Assert.IsFalse(graph.HasEdge(1, 2)); graph.RemoveEdge(2, 3); graph.RemoveEdge(3, 4); graph.RemoveEdge(4, 5); graph.RemoveEdge(4, 1); Assert.IsTrue(graph.HasEdge(3, 5)); graph.RemoveEdge(3, 5); Assert.IsFalse(graph.HasEdge(3, 5)); graph.RemoveVertex(1); graph.RemoveVertex(2); graph.RemoveVertex(3); graph.AddEdge(4, 5); graph.RemoveVertex(4); graph.AddEdge(5, 5); graph.RemoveEdge(5, 5); graph.RemoveVertex(5); Assert.AreEqual(0, graph.VerticesCount); }
/// <summary> /// Computes cost of the most expensive path in the <see cref="graph"/>. /// </summary> /// <param name="graph"></param> /// <param name="topologicalOrder"></param> /// <returns></returns> public double GetMaximumCost(DiGraph <Operation> graph, IReadOnlyList <Operation> topologicalOrder) { double[] highestOperationCosts = new double[topologicalOrder.Count]; // find longest distance to i-th operation for every i for (int i = 1; i < topologicalOrder.Count; i++) { // check all edges to the i-th vertex var operation = topologicalOrder[i]; for (int j = 0; j < i; j++) { var otherOperation = topologicalOrder[j]; if (graph.HasEdge(otherOperation, operation)) { highestOperationCosts[i] = Math.Max(highestOperationCosts[i], highestOperationCosts[j] + otherOperation.Cost); } } } return(highestOperationCosts.Last()); }