17
17
*/
18
18
package com .graphhopper .routing .subnetwork ;
19
19
20
- import com .carrotsearch .hppc .BitSet ;
21
20
import com .carrotsearch .hppc .IntArrayList ;
22
21
import com .carrotsearch .hppc .IntIndexedContainer ;
23
22
import com .graphhopper .routing .ev .BooleanEncodedValue ;
@@ -106,22 +105,37 @@ public int getMaxSubnetworks() {
106
105
int removeSmallSubNetworks (BooleanEncodedValue accessEnc ) {
107
106
// partition graph into strongly connected components using Tarjan's algorithm
108
107
StopWatch sw = new StopWatch ().start ();
109
- TarjanSCC tarjan = new TarjanSCC (ghStorage , accessEnc , false );
110
- TarjanSCC .ConnectedComponents ccs = tarjan .findComponents ();
111
- List <IntArrayList > components = ccs .getComponents ();
112
- BitSet singleNodeComponents = ccs .getSingleNodeComponents ();
113
- logger .info ("Found " + ccs .getTotalComponents () + " subnetworks (" + singleNodeComponents .cardinality () + " single nodes and "
114
- + components .size () + " components with more than one node, total nodes: " + ccs .getNodes () + "), took: " + sw .stop ().getSeconds () + "s" );
108
+ TarjansSCCAlgorithm tarjan = new TarjansSCCAlgorithm (ghStorage , accessEnc , false );
109
+ List <IntArrayList > components = tarjan .findComponents ();
110
+ int totalNodes = 0 ;
111
+ int singleNodeComponents = 0 ;
112
+ for (IntArrayList c : components ) {
113
+ totalNodes += c .size ();
114
+ if (c .size () == 1 )
115
+ singleNodeComponents ++;
116
+ }
117
+ logger .info ("Found " + components .size () + " subnetworks (" + singleNodeComponents + " single nodes and "
118
+ + (components .size () - singleNodeComponents ) + " components with more than one node, total nodes: " + totalNodes + "), took: " + sw .stop ().getSeconds () + "s" );
119
+
120
+ sw = new StopWatch ().start ();
121
+ // find the biggest component
122
+ IntArrayList biggest = components .isEmpty () ? new IntArrayList (0 ) : components .get (0 );
123
+ for (IntArrayList component : components ) {
124
+ if (component .size () > biggest .size ()) {
125
+ biggest = component ;
126
+ }
127
+ }
128
+ logger .info ("finding the biggest component took: " + sw .stop ().getSeconds () + "s" );
115
129
116
130
// remove all small networks except the biggest (even when its smaller than the given min_network_size)
117
131
sw = new StopWatch ().start ();
118
132
int removedComponents = 0 ;
119
133
int removedEdges = 0 ;
120
- int smallestRemaining = ccs . getBiggestComponent () .size ();
134
+ int smallestRemaining = biggest .size ();
121
135
int biggestRemoved = 0 ;
122
136
EdgeExplorer explorer = ghStorage .createEdgeExplorer (DefaultEdgeFilter .allEdges (accessEnc ));
123
137
for (IntArrayList component : components ) {
124
- if (component == ccs . getBiggestComponent () )
138
+ if (component == biggest )
125
139
continue ;
126
140
127
141
if (component .size () < minNetworkSize ) {
@@ -138,9 +152,9 @@ int removeSmallSubNetworks(BooleanEncodedValue accessEnc) {
138
152
throw new IllegalStateException ("Too many total edges were removed: " + removedEdges + " out of " + ghStorage .getEdges () + "\n " +
139
153
"The maximum number of removed edges is: " + allowedRemoved );
140
154
141
- subnetworks = ccs . getTotalComponents () - removedComponents ;
155
+ subnetworks = components . size () - removedComponents ;
142
156
logger .info ("Removed " + removedComponents + " subnetworks (biggest removed: " + biggestRemoved + " nodes) -> " +
143
- subnetworks + " subnetwork(s) left (smallest: " + smallestRemaining + ", biggest: " + ccs . getBiggestComponent () .size () + " nodes)"
157
+ subnetworks + " subnetwork(s) left (smallest: " + smallestRemaining + ", biggest: " + biggest .size () + " nodes)"
144
158
+ ", total removed edges: " + removedEdges + ", took: " + sw .stop ().getSeconds () + "s" );
145
159
return removedEdges ;
146
160
}
0 commit comments