public void execute() {
        Set<InternalNode<N, E>> closed = new HashSet<InternalNode<N, E>>();
        BasicPredGraph<N, E> startPG = new BasicPredGraph<N, E>(this.origin, 0.0f);
        minQueue.add(startPG, Float.POSITIVE_INFINITY);
        while (!minQueue.isEmpty()) {
            PredGraph<N, E> pu = minQueue.extractMin();
            closed.add(pu.getInternalNode());
            if (isDone(pu)) {
                return;
            }
            InternalNode<N, E> u = pu.getInternalNode();
            reachability.setContext(pu);
            Iterator<InternalNode<N, E>> outEdges = graph.getOutGoingEdges(u, reachability);
            while (outEdges.hasNext()) {
                InternalNode<N, E> v = outEdges.next();
                if (closed.contains(v)) {
                    continue;
                }
                PredGraph<N, E> pv = minQueue.get(v);
                if (pv == null) {
                    pv = new BasicPredGraph<N, E>(v,
                            Float.POSITIVE_INFINITY);
                    minQueue.add(pv, Float.POSITIVE_INFINITY);
                }
                if (this.relaxer.relax(pu, pv, weightIndex)) {
                    this.minQueue.update(pv, this.relaxer.newTotalWeight());
                }
            }
        }
    }