1 25 43 package org.jgrapht.alg; 44 45 import java.util.*; 46 47 import org.jgrapht.*; 48 import org.jgrapht.event.*; 49 import org.jgrapht.graph.*; 50 import org.jgrapht.traverse.*; 51 52 53 76 public class ConnectivityInspector<V, E> 77 implements GraphListener<V, E> 78 { 79 80 82 List<Set<V>> connectedSets; 83 Map<V, Set<V>> vertexToConnectedSet; 84 private Graph<V, E> graph; 85 86 88 93 public ConnectivityInspector(UndirectedGraph<V, E> g) 94 { 95 init(); 96 this.graph = g; 97 } 98 99 104 public ConnectivityInspector(DirectedGraph<V, E> g) 105 { 106 init(); 107 this.graph = new AsUndirectedGraph<V, E>(g); 108 } 109 110 112 118 public boolean isGraphConnected() 119 { 120 return lazyFindConnectedSets().size() == 1; 121 } 122 123 135 public Set<V> connectedSetOf(V vertex) 136 { 137 Set<V> connectedSet = vertexToConnectedSet.get(vertex); 138 139 if (connectedSet == null) { 140 connectedSet = new HashSet<V>(); 141 142 BreadthFirstIterator<V, E> i = 143 new BreadthFirstIterator<V, E>(graph, vertex); 144 145 while (i.hasNext()) { 146 connectedSet.add(i.next()); 147 } 148 149 vertexToConnectedSet.put(vertex, connectedSet); 150 } 151 152 return connectedSet; 153 } 154 155 166 public List<Set<V>> connectedSets() 167 { 168 return lazyFindConnectedSets(); 169 } 170 171 174 public void edgeAdded(GraphEdgeChangeEvent<V, E> e) 175 { 176 init(); } 179 180 183 public void edgeRemoved(GraphEdgeChangeEvent<V, E> e) 184 { 185 init(); } 188 189 203 public boolean pathExists(V sourceVertex, V targetVertex) 204 { 205 209 Set sourceSet = connectedSetOf(sourceVertex); 210 211 return sourceSet.contains(targetVertex); 212 } 213 214 217 public void vertexAdded(GraphVertexChangeEvent<V> e) 218 { 219 init(); } 222 223 226 public void vertexRemoved(GraphVertexChangeEvent<V> e) 227 { 228 init(); } 231 232 private void init() 233 { 234 connectedSets = null; 235 vertexToConnectedSet = new HashMap<V, Set<V>>(); 236 } 237 238 private List<Set<V>> lazyFindConnectedSets() 239 { 240 if (connectedSets == null) { 241 connectedSets = new ArrayList<Set<V>>(); 242 243 Set vertexSet = graph.vertexSet(); 244 245 if (vertexSet.size() > 0) { 246 BreadthFirstIterator<V, E> i = 247 new BreadthFirstIterator<V, E>(graph, null); 248 i.addTraversalListener(new MyTraversalListener()); 249 250 while (i.hasNext()) { 251 i.next(); 252 } 253 } 254 } 255 256 return connectedSets; 257 } 258 259 261 268 private class MyTraversalListener 269 extends TraversalListenerAdapter<V, E> 270 { 271 private Set<V> currentConnectedSet; 272 273 276 public void connectedComponentFinished( 277 ConnectedComponentTraversalEvent e) 278 { 279 connectedSets.add(currentConnectedSet); 280 } 281 282 285 public void connectedComponentStarted( 286 ConnectedComponentTraversalEvent e) 287 { 288 currentConnectedSet = new HashSet<V>(); 289 } 290 291 294 public void vertexTraversed(VertexTraversalEvent<V> e) 295 { 296 V v = e.getVertex(); 297 currentConnectedSet.add(v); 298 vertexToConnectedSet.put(v, currentConnectedSet); 299 } 300 } 301 } 302 | Popular Tags |