From fec79e887283e38de05b4feca97c591c392f185c Mon Sep 17 00:00:00 2001 From: ANIRUDDHA ADAK <aniruddhaadak80@gmail.com> Date: Fri, 1 Nov 2024 22:22:04 +0530 Subject: [PATCH] Update kruskal.js 1. Error Message: Corrected typo: "Kruskal's algorithms" to "Kruskal's algorithm." 2. Comparison Callback: Simplified by using weight difference directly. 3. Variable Declaration: Replaced @var comments with const for clarity. 4. Algorithm Logic: Maintained the correct implementation of Kruskal's algorithm. --- src/algorithms/graph/kruskal/kruskal.js | 46 +++++++------------------ 1 file changed, 12 insertions(+), 34 deletions(-) diff --git a/src/algorithms/graph/kruskal/kruskal.js b/src/algorithms/graph/kruskal/kruskal.js index 296616a142..bb49a6883a 100644 --- a/src/algorithms/graph/kruskal/kruskal.js +++ b/src/algorithms/graph/kruskal/kruskal.js @@ -7,53 +7,31 @@ import DisjointSet from '../../../data-structures/disjoint-set/DisjointSet'; * @return {Graph} */ export default function kruskal(graph) { - // It should fire error if graph is directed since the algorithm works only - // for undirected graphs. + // Check for directed graph if (graph.isDirected) { - throw new Error('Kruskal\'s algorithms works only for undirected graphs'); + throw new Error("Kruskal's algorithm works only for undirected graphs"); } - // Init new graph that will contain minimum spanning tree of original graph. + // Initialize the MST graph const minimumSpanningTree = new Graph(); - // Sort all graph edges in increasing order. - const sortingCallbacks = { + // Sort all edges by weight in ascending order + const sortedEdges = new QuickSort({ /** * @param {GraphEdge} graphEdgeA * @param {GraphEdge} graphEdgeB */ - compareCallback: (graphEdgeA, graphEdgeB) => { - if (graphEdgeA.weight === graphEdgeB.weight) { - return 1; - } + compareCallback: (graphEdgeA, graphEdgeB) => graphEdgeA.weight - graphEdgeB.weight, + }).sort(graph.getAllEdges()); - return graphEdgeA.weight <= graphEdgeB.weight ? -1 : 1; - }, - }; - const sortedEdges = new QuickSort(sortingCallbacks).sort(graph.getAllEdges()); + // Initialize disjoint sets for vertices + const disjointSet = new DisjointSet((vertex) => vertex.getKey()); + graph.getAllVertices().forEach((vertex) => disjointSet.makeSet(vertex)); - // Create disjoint sets for all graph vertices. - const keyCallback = (graphVertex) => graphVertex.getKey(); - const disjointSet = new DisjointSet(keyCallback); - - graph.getAllVertices().forEach((graphVertex) => { - disjointSet.makeSet(graphVertex); - }); - - // Go through all edges started from the minimum one and try to add them - // to minimum spanning tree. The criteria of adding the edge would be whether - // it is forms the cycle or not (if it connects two vertices from one disjoint - // set or not). - for (let edgeIndex = 0; edgeIndex < sortedEdges.length; edgeIndex += 1) { - /** @var {GraphEdge} currentEdge */ - const currentEdge = sortedEdges[edgeIndex]; - - // Check if edge forms the cycle. If it does then skip it. + // Add edges to the MST if they don’t form a cycle + for (const currentEdge of sortedEdges) { if (!disjointSet.inSameSet(currentEdge.startVertex, currentEdge.endVertex)) { - // Unite two subsets into one. disjointSet.union(currentEdge.startVertex, currentEdge.endVertex); - - // Add this edge to spanning tree. minimumSpanningTree.addEdge(currentEdge); } }