Exemplo n.º 1
0
 private static void Relax(MasterVertex u, MasterVertex v, int weight)
 {
     if (v.D > u.D + weight)
     {
         v.D      = u.D + weight;
         v.Parent = u;
     }
 }
Exemplo n.º 2
0
 private static void InitializeSingleSource(MasterVertex[] vertices, MasterVertex s)
 {
     foreach (MasterVertex v in vertices)
     {
         v.D      = int.MaxValue;
         v.Parent = null;
     }
     s.D = 0;
 }
Exemplo n.º 3
0
        internal void Dijkstra(string fileName)
        {
            int source = 0;
            int n      = Math.Min(Math.Max(25, fileName.Length / 2), fileName.Length);

            l.Text  = "running Dijsktra's to find shortest paths from source " + source + " for graph in ...";
            l.Text += fileName.Substring(fileName.Length - n, n);
            statusStrip.Update();
            int[][]        graph    = graphs[fileName];
            MasterVertex[] vertices = new MasterVertex[graph.GetLength(0)];
            //Source MasterVertex

            for (int i = 0; i < vertices.Length; i++)
            {
                vertices[i] = new MasterVertex()
                {
                    Name = i.ToString()
                }
            }
            ;
            InitializeSingleSource(vertices, vertices[source]);
            List <MasterVertex> result = new List <MasterVertex>();
            //adding all MasterVertex to priority queue
            PriorityQueue <MasterVertex> queue = new PriorityQueue <MasterVertex>(true);

            for (int i = 0; i < vertices.Length; i++)
            {
                queue.Enqueue(vertices[i].D, vertices[i]);
            }

            //treversing to all vertices
            int    j    = 0;
            double maxJ = vertices.Length * (double)vertices.Length;

            while (queue.Count > 0)
            {
                var u = queue.Dequeue();
                result.Add(u);
                //again traversing to all vertices
                for (int v = 0; v < graph[Convert.ToInt32(u.Name)].Length; v++)
                {
                    p.Value = (int)Math.Round(100 * (j++) / maxJ);
                    if (graph[Convert.ToInt32(u.Name)][v] > 0)
                    {
                        Relax(u, vertices[v], graph[Convert.ToInt32(u.Name)][v]);
                        //updating priority value since distance is changed
                        queue.UpdatePriority(vertices[v], vertices[v].D);
                    }
                }
            }
            p.Value = 0;
            l.Text  = "Ready!";
            statusStrip.Update();
            ssspSolutions[fileName] = result;
        }
Exemplo n.º 4
0
 private static void PrintStringPath(ref String accumulator, MasterVertex u, MasterVertex v, List <MasterVertex> vertices)
 {
     if (v != u)
     {
         PrintStringPath(ref accumulator, u, v.Parent, vertices);
         accumulator = accumulator + ", " + v.Name;
     }
     else
     {
         accumulator = accumulator + v.Name;
     }
 }
Exemplo n.º 5
0
 private static void PrintPath(StreamWriter fileStreamWriter, MasterVertex u, MasterVertex v, List <MasterVertex> vertices)
 {
     if (v != u)
     {
         PrintPath(fileStreamWriter, u, v.Parent, vertices);
         fileStreamWriter.Write(", " + v.Name);
     }
     else
     {
         fileStreamWriter.Write(v.Name);
     }
 }