1 25 42 package org.jgrapht.traverse; 43 44 import java.util.*; 45 46 import org.jgrapht.*; 47 import org.jgrapht.util.*; 48 49 50 72 public class TopologicalOrderIterator<V, E> 73 extends CrossComponentIterator<V, E, Object > 74 { 75 76 78 private LinkedList<V> queue; 79 private Map<V, ModifiableInteger> inDegreeMap; 80 81 83 92 public TopologicalOrderIterator(DirectedGraph<V, E> dg) 93 { 94 this(dg, new LinkedList<V>(), new HashMap<V, ModifiableInteger>()); 95 } 96 97 private TopologicalOrderIterator( 100 DirectedGraph<V, E> dg, 101 LinkedList<V> queue, 102 Map<V, ModifiableInteger> inDegreeMap) 103 { 104 this(dg, initialize(dg, queue, inDegreeMap)); 105 this.queue = queue; 106 this.inDegreeMap = inDegreeMap; 107 } 108 109 private TopologicalOrderIterator(DirectedGraph<V, E> dg, V start) 112 { 113 super(dg, start); 114 } 115 116 118 121 protected boolean isConnectedComponentExhausted() 122 { 123 return queue.isEmpty(); 128 } 129 130 133 protected void encounterVertex(V vertex, E edge) 134 { 135 putSeenData(vertex, null); 136 decrementInDegree(vertex); 137 } 138 139 142 protected void encounterVertexAgain(V vertex, E edge) 143 { 144 decrementInDegree(vertex); 145 } 146 147 150 protected V provideNextVertex() 151 { 152 return queue.removeFirst(); 153 } 154 155 160 private void decrementInDegree(V vertex) 161 { 162 ModifiableInteger inDegree = inDegreeMap.get(vertex); 163 164 if (inDegree.value > 0) { 165 inDegree.value--; 166 167 if (inDegree.value == 0) { 168 queue.addLast(vertex); 169 } 170 } 171 } 172 173 184 private static <V, E> V initialize( 185 DirectedGraph<V, E> dg, 186 LinkedList<V> queue, 187 Map<V, ModifiableInteger> inDegreeMap) 188 { 189 for (Iterator<V> i = dg.vertexSet().iterator(); i.hasNext();) { 190 V vertex = i.next(); 191 192 int inDegree = dg.inDegreeOf(vertex); 193 inDegreeMap.put(vertex, new ModifiableInteger(inDegree)); 194 195 if (inDegree == 0) { 196 queue.add(vertex); 197 } 198 } 199 200 if (queue.isEmpty()) { 201 return null; 202 } else { 203 return queue.getFirst(); 204 } 205 } 206 } 207
| Popular Tags
|