// Minimum spanning tree algorithm public Graph Kruskal() { // Initialization Graph MST = new Graph(false); foreach (string vertName in AdjList.Keys) { MST.AddVertex(vertName); } // disjoint sets of vertices for Kruskal's algorithm VertexDisjointSets Sets = new VertexDisjointSets(); foreach (Vertex vertex in AdjList.Values) { VertexDisjointSets.Node v = new VertexDisjointSets.Node(vertex); Sets.MakeSet(v); } // making set of the edges and sort them List <Edge> edges = new List <Edge>(); foreach (Vertex fr in AdjList.Values) { VertexDisjointSets.Node from = Sets[fr]; foreach (KeyValuePair <Vertex, uint> t in fr.Adj) { VertexDisjointSets.Node to = Sets[t.Key]; Edge e = new Edge(from, to, t.Value); edges.Add(e); } } edges.Sort(); // main part of alg foreach (Edge edge in edges) { if (Sets.FindSet(edge.from) != Sets.FindSet(edge.to)) { MST.AddEdge(edge.from.vertex.Name, edge.to.vertex.Name, edge.weight); Sets.Union(edge.from, edge.to); } } return(MST); }
public Edge(VertexDisjointSets.Node f, VertexDisjointSets.Node t, uint w) { from = f; to = t; weight = w; }