/// <summary>
        /// Zwraca kolejkę krawędzi, oznaczonych numeracją grafu oryginalnego
        /// </summary>
        static EdgesMaxPriorityQueue getGraphEdges(PartGraph partGraph)
        {
            var graph = partGraph.Graph;
            EdgesMaxPriorityQueue edges = new EdgesMaxPriorityQueue();

            int verticesCount = graph.VerticesCount;

            for (int i = 0; i < verticesCount; i++)
            {
                for (int j = 0; j < i; j++)
                {
                    if (!double.IsNaN(graph.GetEdgeWeight(i, j)))
                    {
                        edges.Put(new Edge(partGraph.NumbersInOriginal[i], partGraph.NumbersInOriginal[j], graph.GetEdgeWeight(i, j)));
                    }
                }
            }
            return(edges);
        }
        /// <summary>
        /// Dzieli zbiór krawędzi na dwa podzbiory
        /// A - waga wieksza lub równa niż w B
        /// </summary>
        static (HashSet <Edge>, HashSet <Edge>) setAandB(EdgesMaxPriorityQueue edges)
        {
            // A - waga wieksza lub równa niż w B
            HashSet <Edge> A = new HashSet <Edge>();
            HashSet <Edge> B = new HashSet <Edge>();

            int numEdges = edges.Count;

            for (int i = 0; i < numEdges; i++)
            {
                if (i < numEdges / 2)
                {
                    A.Add(edges.Get());
                }
                else
                {
                    B.Add(edges.Get());
                }
            }

            return(A, B);
        }