public Digraph genIntersectionBipartite(){
        TransitiveClosure tc = new TransitiveClosure(this.G);
        
        // build bipartite graph from G, add an edge <u, |V| + v> when Lout(u) \cap Lin(v) is empty.
        for(int u = 0; u < this.G.V(); u++){
            for(int v = 0; v < this.G.V(); v++){
                if(!tc.reachable(u, v)){
                    this.bipartite.addEdge(u, this.G.V() + v);  // bipartite graph has 2*|V| vertices
                }
            }
        }
        
        
        return bipartite;
    }