using System.Collections.Generic;
using System.Linq;
public static class KruskalAlgorithm
{
public static List<Edge> Kruskal(int numberOfVertices, List<Edge> edges)
{
// Inital sort
edges.Sort();
// Set parents table
var parent = Enumerable.Range(0, numberOfVertices).ToArray();
// Spanning tree list
var spanningTree = new List<Edge>();
foreach (var edge in edges)
{
var startNodeRoot = FindRoot(edge.StartNode, parent);
var endNodeRoot = FindRoot(edge.EndNode, parent);
if (startNodeRoot != endNodeRoot)
{
// Add edge to the spanning tree
spanningTree.Add(edge);
// Mark one root as parent of the other
parent[endNodeRoot] = startNodeRoot;
}
}
// Return the spanning tree
return spanningTree;
}
private static int FindRoot(int node, int[] parent)
{
var root = node;
while (root != parent[root])
{
root = parent[root];
}
while (node != root)
{
var oldParent = parent[node];
parent[node] = root;
node = oldParent;
}
return root;
}
}