diff --git a/src/components/NodeContextMenu.tsx b/src/components/NodeContextMenu.tsx index e6c6d00..2572cba 100644 --- a/src/components/NodeContextMenu.tsx +++ b/src/components/NodeContextMenu.tsx @@ -112,16 +112,20 @@ export default function NodeContextMenu({ ? selectedNodeIds : [nodeContext.nodeId]; - // Also include nodes reachable by outgoing edges from base nodes - const baseIdSet = new Set(baseIds); - const linkedIds = new Set(); - for (const nodeId of baseIds) { + // BFS to collect all nodes reachable via outgoing edges from base nodes (all hops) + const visited = new Set(baseIds); + const queue = [...baseIds]; + while (queue.length > 0) { + const nodeId = queue.shift()!; currentGraph.edges - .filter(e => e.from === nodeId && !baseIdSet.has(e.to)) - .forEach(e => linkedIds.add(e.to)); + .filter(e => e.from === nodeId && !visited.has(e.to)) + .forEach(e => { + visited.add(e.to); + queue.push(e.to); + }); } - const allCutIds = [...baseIds, ...linkedIds]; + const allCutIds = [...visited]; const allCutIdSet = new Set(allCutIds); const cutNodes = currentGraph.nodes.filter(n => allCutIdSet.has(n.id));