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); }