private KosarajuSharirSCC(Digraph<V> digraph) {
    ids = new HashMap<>(digraph.vertexCount());
    visited = new HashSet<>(digraph.vertexCount());
    size = new int[digraph.vertexCount()];

    DepthFirstOrder<V> dfo = DepthFirstOrder.from(digraph.reverse());

    for (V vertex : dfo.reversePost()) {
      if (!visited.contains(vertex)) {
        dfs(digraph, vertex);
        count++;
      }
    }
  }