public Dijkstra(Graph <T> graph, T source) { _graph = graph; _source = graph.Get(source); if (_source == null) { throw new ArgumentException(string.Format("Vertex {0} not found", source)); } }
public void Run() { // setup: _source.Score = 0; var unexplored = GetAllNodes(); var edges = GetSortedEdges(); var explored = new List <Vertex <T> > { _source }; unexplored.Remove(_source); // main loop: while (unexplored.Any() && edges.Any()) { var least = edges.Min(); edges.Remove(least); if (!_graph.IsDirected) { edges.Remove(new Edge <T>(least.To, least.From, least.Weight)); } if (explored.Contains(least.From) && !explored.Contains(least.To)) { least.To.Score = least.From.Score + least.Weight; foreach (var edge in least.To.Edges) { var v = _graph.Get(edge.Key); int edgeWeight = edge.Value; if (v.Score > least.To.Score + edgeWeight) { v.Score = least.To.Score + edgeWeight; } } unexplored.Remove(least.To); explored.Add(least.To); } } }
public void TestSmallGraph() { var g = new Graph<int>(); for (int i = 0; i < 4; ++i) g.GetOrCreateVertex(i); g.Get(0).AddEdge(1, 1); g.Get(0).AddEdge(2, 3); g.Get(1).AddEdge(2, 1); g.Get(1).AddEdge(3, 3); g.Get(2).AddEdge(3, 1); var algorithm = new Dijkstra<int>(g, 0); algorithm.Run(); Assert.AreEqual(0, g.Get(0).Score); Assert.AreEqual(1, g.Get(1).Score); Assert.AreEqual(2, g.Get(2).Score); Assert.AreEqual(3, g.Get(3).Score); }
public void TestSmallGraph() { var g = new Graph <int>(); for (int i = 0; i < 4; ++i) { g.GetOrCreateVertex(i); } g.Get(0).AddEdge(1, 1); g.Get(0).AddEdge(2, 3); g.Get(1).AddEdge(2, 1); g.Get(1).AddEdge(3, 3); g.Get(2).AddEdge(3, 1); var algorithm = new Dijkstra <int>(g, 0); algorithm.Run(); Assert.AreEqual(0, g.Get(0).Score); Assert.AreEqual(1, g.Get(1).Score); Assert.AreEqual(2, g.Get(2).Score); Assert.AreEqual(3, g.Get(3).Score); }
public Vertex <T> Get(T key) { return(_g.Get(key)); }