/** * Forms a strongly connected component by doing a reverse DFS. */ private void formConnectedComponent(ConnectedComponent group) { if(belongsToSCC()) return; this.cc=group; group.add(this); for (Element prev : backEdges) prev.formConnectedComponent(group); }
/** * Builds a set of strongly connected components and puts them * all into the given set. */ public void buildStronglyConnectedComponents(List<ConnectedComponent> ccs) { // store visited elements - loop detection List<Element> visitedElements = new ArrayList<Element>(); for(Element cur=this; cur!=cur.prevPostOrder; cur=cur.prevPostOrder) { if(visitedElements.contains(cur)) { // if I've already processed cur element, I'm in a loop break; } else { visitedElements.add(cur); } if(cur.belongsToSCC()) continue; // start a new component ConnectedComponent cc = new ConnectedComponent(); ccs.add(cc); cur.formConnectedComponent(cc); } }
/** * Builds a set of strongly connected components and puts them * all into the given set. */ public void buildStronglyConnectedComponents(List<ConnectedComponent> ccs) { // store visited elements - loop detection List<Element> visitedElements = new ArrayList<Element>(); for(Element cur=this; cur!=cur.prevPostOrder; cur=cur.prevPostOrder) { if(visitedElements.contains(cur)) { // if I've already processed cur element, I'm in a loop break; } else { visitedElements.add(cur); } if(cur.belongsToSCC()) continue; // start a new component ConnectedComponent cc = new ConnectedComponent(); ccs.add(cc); cur.formConnectedComponent(cc); } }
/** * Forms a strongly connected component by doing a reverse DFS. */ private void formConnectedComponent(ConnectedComponent group) { if(belongsToSCC()) return; this.cc=group; group.add(this); for (Element prev : backEdges) prev.formConnectedComponent(group); }
/** * Forms a strongly connected component by doing a reverse DFS. */ private void formConnectedComponent(ConnectedComponent group) { if(belongsToSCC()) return; this.cc=group; group.add(this); for (Element prev : backEdges) prev.formConnectedComponent(group); }
/** * Builds a set of strongly connected components and puts them * all into the given set. */ public void buildStronglyConnectedComponents(List<ConnectedComponent> ccs) { // store visited elements - loop detection List<Element> visitedElements = new ArrayList<Element>(); for(Element cur=this; cur!=cur.prevPostOrder; cur=cur.prevPostOrder) { if(visitedElements.contains(cur)) { // if I've already processed cur element, I'm in a loop break; } else { visitedElements.add(cur); } if(cur.belongsToSCC()) continue; // start a new component ConnectedComponent cc = new ConnectedComponent(); ccs.add(cc); cur.formConnectedComponent(cc); } }
/** * Builds a set of strongly connected components and puts them * all into the given set. */ public void buildStronglyConnectedComponents(List<ConnectedComponent> ccs) { // store visited elements - loop detection List<Element> visitedElements = new ArrayList<Element>(); for(Element cur=this; cur!=cur.prevPostOrder; cur=cur.prevPostOrder) { if(visitedElements.contains(cur)) { // if I've already processed cur element, I'm in a loop break; } else { visitedElements.add(cur); } if(cur.belongsToSCC()) continue; // start a new component ConnectedComponent cc = new ConnectedComponent(); ccs.add(cc); cur.formConnectedComponent(cc); } }
/** * Forms a strongly connected component by doing a reverse DFS. */ private void formConnectedComponent(ConnectedComponent group) { if(belongsToSCC()) return; this.cc=group; group.add(this); for (Element prev : backEdges) prev.formConnectedComponent(group); }
/** * Forms a strongly connected component by doing a reverse DFS. */ private void formConnectedComponent(ConnectedComponent group) { if(belongsToSCC()) return; this.cc=group; group.add(this); for (Element prev : backEdges) prev.formConnectedComponent(group); }
/** * Builds a set of strongly connected components and puts them * all into the given set. */ public void buildStronglyConnectedComponents(List<ConnectedComponent> ccs) { // store visited elements - loop detection List<Element> visitedElements = new ArrayList<Element>(); for(Element cur=this; cur!=cur.prevPostOrder; cur=cur.prevPostOrder) { if(visitedElements.contains(cur)) { // if I've already processed cur element, I'm in a loop break; } else { visitedElements.add(cur); } if(cur.belongsToSCC()) continue; // start a new component ConnectedComponent cc = new ConnectedComponent(); ccs.add(cc); cur.formConnectedComponent(cc); } }
assert belongsToSCC(); // SCC discomposition must be done first
assert belongsToSCC(); // SCC discomposition must be done first
assert belongsToSCC(); // SCC discomposition must be done first
assert belongsToSCC(); // SCC discomposition must be done first
assert belongsToSCC(); // SCC discomposition must be done first