UNPKG

dist-javascript-algorithms-and-data-structures

Version:

Algorithms and data-structures implemented on JavaScript

68 lines (52 loc) 2.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = kruskal; var _Graph = _interopRequireDefault(require("../../../data-structures/graph/Graph")); var _QuickSort = _interopRequireDefault(require("../../sorting/quick-sort/QuickSort")); var _DisjointSet = _interopRequireDefault(require("../../../data-structures/disjoint-set/DisjointSet")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @param {Graph} graph * @return {Graph} */ function kruskal(graph) { // It should fire error if graph is directed since the algorithm works only // for undirected graphs. if (graph.isDirected) { throw new Error('Kruskal\'s algorithms works only for undirected graphs'); } // Init new graph that will contain minimum spanning tree of original graph. const minimumSpanningTree = new _Graph.default(); // Sort all graph edges in increasing order. const sortingCallbacks = { /** * @param {GraphEdge} graphEdgeA * @param {GraphEdge} graphEdgeB */ compareCallback: (graphEdgeA, graphEdgeB) => { if (graphEdgeA.weight === graphEdgeB.weight) { return 1; } return graphEdgeA.weight <= graphEdgeB.weight ? -1 : 1; } }; const sortedEdges = new _QuickSort.default(sortingCallbacks).sort(graph.getAllEdges()); // Create disjoint sets for all graph vertices. const keyCallback = graphVertex => graphVertex.getKey(); const disjointSet = new _DisjointSet.default(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. 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); } } return minimumSpanningTree; }