public void TestShortestPath() { ShortestPathGraph g = new ShortestPathGraph(); g.AddEdge(0, 1, 4); g.AddEdge(0, 7, 8); g.AddEdge(1, 2, 8); g.AddEdge(1, 7, 11); g.AddEdge(2, 3, 7); g.AddEdge(2, 5, 4); g.AddEdge(2, 8, 2); g.AddEdge(3, 4, 9); g.AddEdge(3, 5, 14); g.AddEdge(4, 5, 10); g.AddEdge(5, 6, 2); g.AddEdge(6, 7, 1); g.AddEdge(6, 8, 6); g.AddEdge(7, 8, 7); g.GenerateShortestPathsFrom(0); Assert.AreEqual(4, g.GetShortestPathTo(1)); Assert.AreEqual(12, g.GetShortestPathTo(2)); Assert.AreEqual(19, g.GetShortestPathTo(3)); Assert.AreEqual(21, g.GetShortestPathTo(4)); Assert.AreEqual(11, g.GetShortestPathTo(5)); Assert.AreEqual(9, g.GetShortestPathTo(6)); Assert.AreEqual(8, g.GetShortestPathTo(7)); Assert.AreEqual(14, g.GetShortestPathTo(8)); }
public ShortestPathGraph ForComponent(ConnectedComponent component, Dictionary <int, ConnectedComponent> vertexComponent) { return(ComponentsCache.GetOrCreate( Tuple.Create(component.OwnerPunterId, component.Id), key => ShortestPathGraph.Build(Graph, edge => { if (edge.Owner == -1) { return true; } if (!edge.IsOwnedBy(component.OwnerPunterId)) { return false; } if (vertexComponent.ContainsKey(edge.To) && vertexComponent.ContainsKey(edge.From) && vertexComponent[edge.To] == vertexComponent[edge.From]) { return false; } return true; }, component.Vertices))); }