Kruskal Algorithm

Minimum spanning trees play a vital role in network design, clustering, and optimization problems. Kruskal's Algorithm is one of the popular algorithms used to find the minimum spanning tree of a graph by greedily selecting edges with the smallest weight while avoiding cycles.

Kruskal's Algorithm works by sorting the edges of the graph based on their weights in non-decreasing order. It then iterates through the sorted edges, adding each edge to the minimum spanning tree if it does not form a cycle with the edges already selected.

class UnionFind {
    constructor(graphKeys) {
        const graphLength = graphKeys.length
        this.parent = new Array(graphLength);
        this.rank = new Array(graphLength);
        for (let i = 0; i < graphLength; i++) {
            this.parent[graphKeys[i]] = graphKeys[i];
            this.rank[i] = 0;
        }
    }

    find(x) {
        if (this.parent[x] !== x) {
            this.parent[x] = this.find(this.parent[x]);
        }
        return this.parent[x];
    }

    union(x, y) {
        const rootX = this.find(x);
        const rootY = this.find(y);
        if (rootX !== rootY) {
            if (this.rank[rootX] < this.rank[rootY]) {
                this.parent[rootX] = rootY;
            } else if (this.rank[rootX] > this.rank[rootY]) {
                this.parent[rootY] = rootX;
            } else {
                this.parent[rootY] = rootX;
                this.rank[rootX]++;
            }
        }
    }
}

function kruskal(graph) {
    const edges = [];
    const mst = [];
    const uf = new UnionFind(Object.keys(graph));
    // Populate edges array with all edges from the graph
    for (const vertex in graph) {
        for (const neighbor in graph[vertex]) {
            edges.push([vertex, neighbor, graph[vertex][neighbor]]);
        }
    }
    // Sort edges by weight in non-decreasing order
    edges.sort((a, b) => a[2] - b[2]);
    for (const edge of edges) {
        const [src, dest, weight] = edge;
        const rootSrc = uf.find(src); 
       // Convert vertex to array index (A -> 0, B -> 1, ...)
        const rootDest = uf.find(dest);
        if (rootSrc !== rootDest) {
            mst.push(edge);
            uf.union(rootSrc, rootDest);
        }
    }
    return mst;
}
// Example usage:
const graph = {
    'A': { 'B': 10, 'C': 6, 'D': 5 },
    'B': { 'A': 10, 'D': 15 },
    'C': { 'A': 6, 'D': 4 },
    'D': { 'A': 5, 'B': 15, 'C': 4 }
};

console.log(kruskal(graph)); 

This code snippet will output the minimum spanning tree (MST) of the provided graph using Kruskal's Algorithm.

The time complexity of Kruskal's Algorithm is O(E log V), where E is the number of edges and V is the number of vertices in the graph. This complexity arises from sorting the edges and performing union-find operations.

Kruskal's Algorithm finds applications in network design, such as connecting cities with minimal cost in transportation networks or laying down cables in communication networks.

Comments

Please log in to post a comment.

No comments yet.

Be the first to comment!