Example #1
0
 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));
     }
 }
Example #2
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
 public Vertex <T> Get(T key)
 {
     return(_g.Get(key));
 }