import {Queue} from 'queue-typescript' import {BasicGraphOnEdges} from '../../structs/basicGraphOnEdges' import {IEdge} from '../../structs/iedge' export function* GetConnectedComponents(graph: BasicGraphOnEdges): IterableIterator { const enqueueed = new Array(graph.nodeCount).fill(false) const queue = new Queue() for (let i = 0; i < graph.nodeCount; i++) { if (!enqueueed[i]) { const nodes = new Array() Enqueue(i, queue, enqueueed) while (queue.length > 0) { const s: number = queue.dequeue() nodes.push(s) for (const neighbor of Neighbors(graph, s)) { Enqueue(neighbor, queue, enqueueed) } } yield nodes } } } function* Neighbors(graph: BasicGraphOnEdges, s: number): IterableIterator { for (const e of graph.outEdges[s]) { yield e.target } for (const e of graph.inEdges[s]) { yield e.source } } function Enqueue(i: number, q: Queue, enqueueed: boolean[]) { if (enqueueed[i] === false) { q.enqueue(i) enqueueed[i] = true } }