public WeightedGraph MinimumSpaningTree()
        {
            var tree = new WeightedGraph();

            var queue = new PriorityQueue <Edge, int>();

            var firstNode = Nodes.Values.First();

            foreach (var edge in firstNode.GetEdges())
            {
                queue.Enqueue(edge, edge.Weight);
            }

            tree.AddNode(firstNode.Label);



            while (tree.Nodes.Count < Nodes.Count && queue.Count != 0)
            {
                var minEdge  = queue.Dequeue();
                var nextNode = minEdge.To;

                if (tree.ContainsNode(nextNode.Label))
                {
                    continue;
                }

                tree.AddNode(nextNode.Label);
                tree.AddEdge(minEdge.From.Label, nextNode.Label, minEdge.Weight);

                foreach (var edge in nextNode.GetEdges())
                {
                    if (!tree.ContainsNode(edge.To.Label))
                    {
                        queue.Enqueue(edge, edge.Weight);
                    }
                }
            }

            return(tree);
        }