mirror of
https://github.com/trekhleb/javascript-algorithms.git
synced 2025-12-08 19:06:00 +00:00
32 lines
1.2 KiB
JavaScript
32 lines
1.2 KiB
JavaScript
import DisjointSet from '../../../data-structures/disjoint-set/DisjointSet';
|
|
|
|
/**
|
|
* Detect cycle in undirected graph using disjoint sets.
|
|
*
|
|
* @param {Graph} graph
|
|
*/
|
|
export default function detectUndirectedCycleUsingDisjointSet(graph) {
|
|
// Create initial singleton disjoint sets for each graph vertex.
|
|
/** @param {GraphVertex} graphVertex */
|
|
const keyExtractor = graphVertex => graphVertex.getKey();
|
|
const disjointSet = new DisjointSet(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;
|
|
}
|