public static ConnectedComponents findComponentsRecursive(Graph graph, EdgeTransitionFilter edgeTransitionFilter, boolean excludeSingleEdgeComponents) {
        return new EdgeBasedTarjanSCC(graph, edgeTransitionFilter, excludeSingleEdgeComponents).findComponentsRecursive();
    }
@Test
    public void oneWayBridges() {
        // 0 - 1 -> 2 - 3
        //          |   |
        //          4 - 5 -> 6 - 7
        g.edge(0, 1).setDistance(1).set(speedEnc, 10, 10);
        g.edge(1, 2).setDistance(1).set(speedEnc, 10, 0);
        g.edge(2, 3).setDistance(1).set(speedEnc, 10, 10);
        g.edge(2, 4).setDistance(1).set(speedEnc, 10, 10);
        g.edge(3, 5).setDistance(1).set(speedEnc, 10, 10);
        g.edge(4, 5).setDistance(1).set(speedEnc, 10, 10);
        g.edge(5, 6).setDistance(1).set(speedEnc, 10, 0);
        g.edge(6, 7).setDistance(1).set(speedEnc, 10, 10);
        ConnectedComponents result = EdgeBasedTarjanSCC.findComponentsRecursive(g, fwdAccessFilter, false);
        assertEquals(16, result.getEdgeKeys());
        assertEquals(7, result.getTotalComponents());
        // 0-1, 2-3-5-4-2 and 6-7
        assertEquals(3, result.getComponents().size());
        // 1->2, 2->1 and 5->6, 6<-5
        assertEquals(4, result.getSingleEdgeComponents().cardinality());
        assertEquals(result.getComponents().get(1), result.getBiggestComponent());
    }