public KruskalMst(EdgeWeightedGraph graph) { _mst = new Queue <Edge>(); var edges = graph.Edges(); Array.Sort(edges, (edge, edge1) => edge.CompareTo(edge1)); var vertices = graph.Vertices(); var uf = new QuickFind(vertices.Length); var count = 0; while (count < edges.Length && _mst.Count < vertices.Length - 1) { var edge = edges[count]; var v = edge.Either(); var w = edge.Other(v); if (!uf.Connected(v, w)) { uf.Union(v, w); _mst.Enqueue(edge); } count++; } }
public KruskaMST(EdgeWeightedGraph g) { m_mst = new Queue <Edge>(); MinPQ <Edge> pq = new MinPQ <Edge>(g.Edges()); UnionFind uf = new UnionFind(g.V()); while (!pq.IsEmpty() && m_mst.Count < g.V() - 1) { Edge e = pq.DeleteTop(); int v = e.Either(); int w = e.Other(v); if (uf.Connected(v, w)) { continue; } uf.Union(v, w); m_mst.Enqueue(e); } }
public KruskalMinimumSpanTree(EdgeWeightedGraph g) { mst = new List <Edge>(); var pq = new MinPriorityQueue <Edge>(g.Ecount); foreach (var e in g.Edges()) { pq.Insert(e); } var uf = new UF(g.Vcount); while (!pq.IsEmpty() && mst.Count < g.Vcount - 1) { var e = pq.DelMin(); int v = e.Either; int w = e.Other(v); if (uf.Connected(v, w)) { continue; } uf.Union(v, w); mst.Add(e); } }