private static int[] DijkstraS_Algorithm(DataWeightedGraph graph)
        {
            //int[] dist = BFS_Dijkstra(graph, 0);
            int[] dist = BFS_Dijkstra1(graph, 0);

            return dist;
        }
        private static string[] ShortestPaths(DataWeightedGraph g, int s)
        {
            int n = g.Vertexes.Length;
            dist = new int[n];
            distX = new string[n];
            for (int i = 0; i < n; i++)
            {
                dist[i] = Int32.MaxValue;
                distX[i] = "x";
            }
            dist[s] = 0;
            distX[s] = dist[s].ToString();

            for (int i = 0; i < n - 1; i++)
            {
                for (int v = 0; v < n; v++)
                {
                    if (g.Vertexes[v] == null)
                    {
                        continue;
                    }

                    foreach(WeightEdge e in g.Vertexes[v])
                    {
                        Update(v, e);
                    }
                }
            }

            return distX;
        }
        private static int[] BFS_Dijkstra1(DataWeightedGraph graph, int s)
        {
            int[] distTo = new int[graph.Vertexes.Length];

            for(int v = 0; v < graph.Vertexes.Length; v++)
            {
                distTo[v] = Int32.MaxValue;
            }

            distTo[s] = 0;
            // puth in priority queue key(distance) & value(list of index of vertex)
            List<int> l = new List<int>();
            l.Add(s);
            pq.Add(distTo[s], l);

            while (pq.Count != 0)
            {
                List<int> listU = pq[pq.Keys.First()];
                pq.Remove(pq.Keys.First());

                foreach (int u in listU)
                {
                    foreach (WeightEdge e in graph.Vertexes[u])
                    {
                        int uFrom = u;
                        int vTo = e.VertexTo;

                        int distSum = distTo[uFrom] + e.Weight;

                        if (distTo[vTo] <= distSum)
                        {
                            continue;
                        }

                        distTo[vTo] = distSum;

                        if (pq.ContainsKey(distTo[vTo]))
                        {
                            pq[distTo[vTo]].Add(vTo);
                        }
                        else
                        {
                            List<int> ll = new List<int>();
                            ll.Add(vTo);
                            pq.Add(distTo[vTo], ll);
                        }
                    }
                }
            }

            for(int i = 0; i < distTo.Length; i++)
            {
                distTo[i] = (distTo[i] == Int32.MaxValue ? -1 : distTo[i]);
            }

            return distTo;
        }
        static void Main(string[] args)
        {
            DataWeightedGraph graph = new DataWeightedGraph("Bellman-Ford Algorithm.txt");
            //graph.Print();
            Console.WriteLine();

            string[] r = BellmanFordAlgorithm(graph);

            Utils.PrintArrayToFileX(r);
            Console.WriteLine();
            Console.WriteLine("Finish!");
            Console.ReadKey();
        }
        static void Main(string[] args)
        {
            DataWeightedGraph graph = new DataWeightedGraph("Dijkstra's Algorithm.txt");
            //graph.Print();
            //Console.WriteLine();

            int[] r = DijkstraS_Algorithm(graph);

            //Utils.PrintArray(r);
            Utils.PrintArrayToFile(r);

            Console.WriteLine("\r\nFinish!");
            Console.ReadKey();
        }
        private static int[] BFS(DataWeightedGraph graph, int s)
        {
            Queue<int> q = new Queue<int>();
            int[] dist = new int[graph.countVertexes];

            for(int i = 0; i < dist.Length; i++)
            {
                dist[i] = -1;
            }

            dist[0] = 0;
            q.Enqueue(s);

            while (!(q.Count == 0))
            {
                int u = q.Dequeue();

                foreach(WeightEdge e in graph.Vertexes[u])
                {
                    if (dist[e.VertexTo] != -1)
                    {
                        continue;
                    }

                    q.Enqueue(e.VertexTo);
                    dist[e.VertexTo] = dist[u] + 1;
                }
            }
            return dist;
        }
        private static int[] BFS_Dijkstra(DataWeightedGraph graph, int s)
        {
            int[] dist = new int[graph.countVertexes];
            bool[] mark = new bool[graph.countVertexes];

            for(int i = 0; i < graph.countVertexes; i++)
            {
                dist[i] = Int32.MaxValue;
                mark[i] = false;
            }
            dist[s] = 0;

            while(true)
            {
                // получим вершину с минимальным весом из всех непосещенных(mark=false)
                int i = getMinFromDist(dist, mark);
                if (i == -1)
                {
                    break;
                }

                // для каждого соседа для вершины i
                // по порядку расстояния до них или нет(???)
                if (null == graph.Vertexes[i])
                {
                    graph.Vertexes[i] = new List<WeightEdge>();
                }
                foreach (WeightEdge edge in graph.Vertexes[i])
                {
                    if (mark[edge.VertexTo])
                    {
                        continue;
                    }

                    int distSum = dist[i] + edge.Weight;
                    if (distSum > dist[edge.VertexTo])
                    {
                        continue;
                    }
                    dist[edge.VertexTo] = distSum;
                }

                mark[i] = true;
            }

            for(int i = 0; i < dist.Length; i++ )
            {
                if (dist[i] != Int32.MaxValue)
                {
                    continue;
                }
                dist[i] = -1;
            }

            return dist;
        }
 private static string[] BellmanFordAlgorithm(DataWeightedGraph g)
 {
     return ShortestPaths(g, 0);
 }