public void TestMST() { MST mst = new MST(); mst.AddEdge(1, 2, 1); mst.AddEdge(1, 3, 3); mst.AddEdge(1, 4, 4); mst.AddEdge(2, 3, 2); mst.AddEdge(3, 4, 5); mst.Execute(); Assert.AreEqual(7, mst.Cost); }
// Prim's MST public override void GenerateMST() { Init(); for (int i = 0; i < graph.Size; i++) { int v = FindMinimumDistance(); var newDistance = distance[v]; if (newDistance < INFINITY) { componentOfMST[v] = true; var v1 = graph.GetVertexByID((uint)v); var v2 = neighbor[v]; var edge = new Edge <V, int>(v1, v2); MST.AddEdge(edge); foreach (var w in graph.GetNeighbours(v1)) { var e2 = graph.GetEdge(v1, w); if (!componentOfMST[w.ID] && e2.Value < distance[w.ID]) { distance[w.ID] = e2.Value; neighbor[w.ID] = v1; } } } else { break; } } }
// Kruskal's MST /* * 1. Sort edges by decresing weight * 2. Pick the first edge with lowest weight * 3. Detect cycle * 4. Add to graph if not cycle */ public override void GenerateMST() { var edgeEnum = graph.Edges.OrderBy(e => e.Value); foreach (var nextEdge in edgeEnum) { var isCycle = unionFind.IsCycle((int)nextEdge.Start.ID, (int)nextEdge.End.ID); if (!isCycle) { MST.AddEdge(nextEdge); } } }
static void Main(string[] args) { var mst = new MST(); string line; using (StreamReader srStreamRdr = new StreamReader(@"edges.txt")) { while ((line = srStreamRdr.ReadLine()) != null) { string[] values = line.Split(new Char[] { ' ' }); mst.AddEdge(int.Parse(values[0]), int.Parse(values[1]), int.Parse(values[2])); } } mst.Execute(); Console.WriteLine(mst.Cost); Console.ReadKey(); }
// Prim's MST public override void GenerateMST() { Init(); while (!queue.Empty) { var e = queue.Dequeue(); var v = e.Start; var w = e.End; if (componentOfMST[v.ID] && componentOfMST[w.ID]) { continue; } MST.AddEdge(e); Visit(v); Visit(w); } }