UNPKG

dist-javascript-algorithms-and-data-structures

Version:

Algorithms and data-structures implemented on JavaScript

41 lines (33 loc) 1.44 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = detectUndirectedCycleUsingDisjointSet; var _DisjointSet = _interopRequireDefault(require("../../../data-structures/disjoint-set/DisjointSet")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Detect cycle in undirected graph using disjoint sets. * * @param {Graph} graph */ function detectUndirectedCycleUsingDisjointSet(graph) { // Create initial singleton disjoint sets for each graph vertex. /** @param {GraphVertex} graphVertex */ const keyExtractor = graphVertex => graphVertex.getKey(); const disjointSet = new _DisjointSet.default(keyExtractor); graph.getAllVertices().forEach(graphVertex => disjointSet.makeSet(graphVertex)); // Go trough all graph edges one by one and check if edge vertices are from the // different sets. In this case joint those sets together. Do this until you find // an edge where to edge vertices are already in one set. This means that current // edge will create a cycle. let cycleFound = false; /** @param {GraphEdge} graphEdge */ graph.getAllEdges().forEach(graphEdge => { if (disjointSet.inSameSet(graphEdge.startVertex, graphEdge.endVertex)) { // Cycle found. cycleFound = true; } else { disjointSet.union(graphEdge.startVertex, graphEdge.endVertex); } }); return cycleFound; }