/// <summary> /// Computes total wieghts from start node for all nodes in graph /// </summary> public Dijkstra Compute(DijkstraGraph graph) { while (graph.HasUnvisited()) { var current = graph.NearestUnvisited(); foreach (var node in graph.Linked(current)) { var weightFromCurrent = current.TotalWeigth + current.LinkWeight(node); // if this way shorter if (!node.TotalWeigth.HasValue || weightFromCurrent < node.TotalWeigth) { node.TotalWeigth = weightFromCurrent; node.Previous = current; } } current.IsVisited = true; } return this; }
public void NearestUnvisited_ReturnsFirstUnvisitedWithMinimalMark_Test() { // Arrange var node1 = Mock.Of<DijkstraNode>(t => t.IsVisited == false && t.TotalWeigth == 3); var node2 = Mock.Of<DijkstraNode>(t => t.IsVisited == false && t.TotalWeigth == 3); var node3 = Mock.Of<DijkstraNode>(t => t.IsVisited == false && t.TotalWeigth == 10); var node4 = Mock.Of<DijkstraNode>(t => t.IsVisited == true && t.TotalWeigth == 1); var graph = new DijkstraGraph() { Nodes = new[] { node1, node2, node3, node4 } }; // Act var nearest = graph.NearestUnvisited(); // Assert Assert.AreEqual(nearest, node1); }
public void NearestVisited_ThrowsIfHasNotUnvisited_Test() { // Arrange var graph = new DijkstraGraph() { Nodes = new[] { Mock.Of<DijkstraNode>(t => t.IsVisited), Mock.Of<DijkstraNode>(t => t.IsVisited == false && t.TotalWeigth == null) } }; // Assert Assert.Throws<GraphHasNotUnvisitedNodesException>(() => graph.NearestUnvisited()); }