public static Geodesic getDivideAndConquerGeodesicNoCommonEdges(PhyloTree t1, PhyloTree t2) {
        Bipartition minEl;
        PhyloTree newT1 = null;
        Geodesic geo = null;
        Geodesic potentialGeoToReturn = null;
        RatioSequence rsForPotentialGeoToReturn = null;

        Vector<Bipartition> m = t2.getCrossingsWith(t1);

//		System.out.println("In getDistance() crossings are: " + m);

        if (m == null) {
            System.out.println("The trees " + t1 + " and " + t2 + " do not have the same leaf labels.");
            throw new RuntimeException();
        }

        // the base case is when m contains all the same element
        Bipartition mEl = m.get(0);
        Boolean inBaseCase = true;
        for (int i = 1; i < m.size(); i++) {
            if (!(m.get(i).equals(mEl))) {
                inBaseCase = false;
                break;
            }
        }
        if (inBaseCase) {
            numBaseCase++;

            RatioSequence rs = new RatioSequence();
            rs.add(new Ratio(myVectorClonePhyloTreeEdge(t1.getEdges()), myVectorClonePhyloTreeEdge(t2.getEdges())));
//			System.out.println("in base case: returning geo " + new Geodesic(t1.getDistanceFromOrigin() + t2.getDistanceFromOrigin(), rs));
//			return new Geodesic(t1.getDistanceFromOrigin() + t2.getDistanceFromOrigin(), rs);
            return new Geodesic(rs);
        }

/*		if (t1.getLeaf2NumMap().size() > 25) {
			System.out.println("Called getDivideAndConquer... for trees t1 " + t1 + " and t2 " + t2);
		}*/


//		System.out.println("m is " + m);
//		get the minimal elements from m
        Vector<Bipartition> minEls = getMinElements(m);

        // for each min element, divide problem on the new edges
        for (int i = 0; i < minEls.size(); i++) {
            minEl = minEls.get(i);
//			System.out.println("minEl is " + minEl + " of " + minEls );
            Ratio ratio = calculateRatio(minEl, m, t1.getEdges(), t2.getEdges());

            // remove the edges from t1 corresponding to 1's in minEl
            newT1 = new PhyloTree(myVectorClonePhyloTreeEdge(t1.getEdges()), myVectorCloneString(t1.getLeaf2NumMap()));
            newT1.removeEdgesIndicatedByOnes(minEl);

            // add all edges equal to the minEl in m
            for (int j = 0; j < m.size(); j++) {
                if (m.get(j).equals(minEl)) {
//					System.out.println("Added split!");
//					System.out.println("newT1 before adding split " + t2.getEdge(j) + ": " + newT1);
                    newT1.addEdge(t2.getEdge(j).clone());
//					System.out.println("newT1 after adding: " + newT1);
                }
            }

            // find the shortest distance from newT1 to t2
//			System.out.println("Calling getGeodesic on newT1 " + newT1 + "; old t1 was " + t1);
//			System.out.println("num edges in newT1 = " + newT1.getEdges().size());

            Geodesic potentialGeo = getGeodesicRecursive(newT1, t2, "divide");
//			System.out.println("potential geo is " + potentialGeo);

            // combine the geodesic we found with minEl to get the geodesic to compare
            // with the other geodesics generated from other minEls
            rsForPotentialGeoToReturn = new RatioSequence();
            rsForPotentialGeoToReturn.add(ratio);
            rsForPotentialGeoToReturn.addAll(potentialGeo.getRS());
//			System.out.println("rsForGeoToReturn is " + rsForGeoToReturn);
            potentialGeoToReturn = new Geodesic(rsForPotentialGeoToReturn);

            if (geo == null) {
                geo = potentialGeoToReturn.clone();
            } else if (potentialGeoToReturn.getDist() < geo.getDist()) {
                geo = potentialGeoToReturn.clone();
            }

        }
//		System.out.println("Returning geo " + geo);
        return geo;
    }