public static ConnectedComponents findComponentsRecursive(Graph graph, EdgeTransitionFilter edgeTransitionFilter, boolean excludeSingleEdgeComponents) {
        return new EdgeBasedTarjanSCC(graph, edgeTransitionFilter, excludeSingleEdgeComponents).findComponentsRecursive();
    }
@Test
    public void biggerGraph() {
        // this graph has two bigger components (nodes 0, 1, 3 and the others). Still there are some (directed) edges
        // that do not belong to these components but rather represent isolated single-edge components
        // 0 - 1 < 2 - 4 > 5
        //     |   |       |
        //     |    \< 6 - 7
        //     3        \- 8
        g.edge(0, 1).setDistance(1).set(speedEnc, 10, 10); // edge-keys 0,1
        g.edge(2, 1).setDistance(1).set(speedEnc, 10, 0); // edge-keys 2,3
        g.edge(1, 3).setDistance(1).set(speedEnc, 10, 10); // edge-keys 4,5
        g.edge(2, 4).setDistance(1).set(speedEnc, 10, 10); // edge-keys 6,7
        g.edge(6, 2).setDistance(1).set(speedEnc, 10, 0); // edge-keys 8,9
        g.edge(4, 5).setDistance(1).set(speedEnc, 10, 0); // edge-keys 10,11
        g.edge(5, 7).setDistance(1).set(speedEnc, 10, 10); // edge-keys 12,13
        g.edge(6, 7).setDistance(1).set(speedEnc, 10, 10); // edge-keys 14,15
        g.edge(6, 8).setDistance(1).set(speedEnc, 10, 10); // edge-keys 16,17
        ConnectedComponents result = EdgeBasedTarjanSCC.findComponentsRecursive(g, fwdAccessFilter, false);
        assertEquals(18, result.getEdgeKeys());
        assertEquals(6, result.getTotalComponents());
        assertEquals(2, result.getComponents().size());
        assertEquals(result.getComponents().get(1), result.getBiggestComponent());
        assertEquals(IntArrayList.from(1, 5, 4, 0), result.getComponents().get(0));
        assertEquals(IntArrayList.from(7, 8, 13, 14, 17, 16, 15, 12, 10, 6), result.getComponents().get(1));
        assertEquals(4, result.getSingleEdgeComponents().cardinality());
        for (IntCursor c : IntArrayList.from(9, 2, 3, 11)) {
            assertTrue(result.getSingleEdgeComponents().get(c.value));
        }
    }