1 salcianu 1.1 // TopSortedCompDiGraph.java, created Thu Mar 4 08:10:43 2004 by salcianu 2 salcianu 1.1 // Copyright (C) 2003 Alexandru Salcianu <salcianu@MIT.EDU> 3 salcianu 1.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 salcianu 1.1 package harpoon.Util.Graphs; 5 salcianu 1.1 6 salcianu 1.1 import java.util.Iterator; 7 salcianu 1.1 import java.util.Set; 8 salcianu 1.1 import java.util.List; 9 salcianu 1.1 import java.util.LinkedList; 10 salcianu 1.1 11 salcianu 1.1 import net.cscott.jutil.ReverseListIterator; 12 salcianu 1.1 13 salcianu 1.1 import harpoon.Util.DataStructs.ReverseListView; 14 salcianu 1.1 15 salcianu 1.1 /** 16 salcianu 1.1 * <code>TopSortedCompDiGraph</code> 17 salcianu 1.1 * 18 salcianu 1.1 * @author Alexandru Salcianu <salcianu@MIT.EDU> 19 salcianu 1.2 * @version $Id: TopSortedCompDiGraph.java,v 1.2 2004/03/05 15:38:14 salcianu Exp $ 20 salcianu 1.1 */ 21 salcianu 1.2 public class TopSortedCompDiGraph<Vertex> 22 salcianu 1.2 extends DiGraph<SCComponent/*<Vertex>*/> { 23 salcianu 1.1 24 salcianu 1.1 /** Constructs the topologically sorted component digraph of 25 salcianu 1.1 <code>digraph</code>. */ 26 salcianu 1.1 public TopSortedCompDiGraph(DiGraph graph) { 27 salcianu 1.2 DiGraph<SCComponent/*<Vertex>*/> sccGraph = 28 salcianu 1.1 graph.getComponentDiGraph(); 29 salcianu 1.1 sccRoots = sccGraph.getRoots(); 30 salcianu 1.1 // build list of topologically sorted SCCs 31 salcianu 1.1 sccSortedList = new LinkedList(); 32 salcianu 1.1 sccGraph.dfs 33 salcianu 1.1 (null, // no action on node entry 34 salcianu 1.1 // on dfs termination, add scc to front of sccSortedList 35 salcianu 1.2 new VertexVisitor<SCComponent/*<Vertex>*/>() { 36 salcianu 1.2 public void visit(SCComponent/*<Vertex>*/ scc) { 37 salcianu 1.1 sccSortedList.addFirst(scc); 38 salcianu 1.1 } 39 salcianu 1.1 }); 40 salcianu 1.1 } 41 salcianu 1.1 42 salcianu 1.1 public TopSortedCompDiGraph(Set/*<Vertex>*/ roots, 43 salcianu 1.1 Navigator/*<Vertex>*/ nav) { 44 salcianu 1.1 this(DiGraph.diGraph(roots, nav)); 45 salcianu 1.1 } 46 salcianu 1.1 47 salcianu 1.1 // set of top-level SCCs (no incoming edges + all SCCs are 48 salcianu 1.1 // reachable from here) 49 salcianu 1.2 private final Set<SCComponent/*<Vertex>*/> sccRoots; 50 salcianu 1.1 // list of all SCCs, in decreasing topologic order 51 salcianu 1.2 private final LinkedList<SCComponent/*<Vertex>*/> sccSortedList; 52 salcianu 1.1 53 salcianu 1.2 public Set<SCComponent/*<Vertex>*/> getRoots() { 54 salcianu 1.1 return sccRoots; 55 salcianu 1.1 } 56 salcianu 1.1 57 salcianu 1.2 public Navigator<SCComponent/*<Vertex>*/> getNavigator() { 58 salcianu 1.1 return SCComponent.SCC_NAVIGATOR; 59 salcianu 1.1 } 60 salcianu 1.1 61 salcianu 1.1 /** @return list of the strongly connected components of the 62 salcianu 1.1 underlying digraph, in <b>decreasing</b> topologic order, 63 salcianu 1.1 i.e., starting with the SCCs with no incoming edges. */ 64 salcianu 1.2 public List<SCComponent/*<Vertex>*/> decrOrder() { 65 salcianu 1.1 return sccSortedList; 66 salcianu 1.1 } 67 salcianu 1.1 68 salcianu 1.1 /** @return list of the strongly connected components of the 69 salcianu 1.1 underlying digraph, in <b>increasing</b> topologic order, 70 salcianu 1.1 i.e., starting with the SCCs with no outgoing edges. */ 71 salcianu 1.2 public List<SCComponent/*<Vertex>*/> incrOrder() { 72 salcianu 1.2 return new ReverseListView<SCComponent/*<Vertex>*/>(sccSortedList); 73 salcianu 1.1 } 74 salcianu 1.1 75 salcianu 1.1 } 76 salcianu 1.1