public Vector<VertexType> acyclicSP(BaseGraph<VertexType, EdgeType> g, VertexType v) throws InvalidVertexException {
        BaseGraph<VertexType, EdgeType> gcopy = g.copy(gc);
        final Integer dist[] = new Integer[g.getVerticesCount()];
        Vector<VertexType> prev = new Vector<VertexType>();
        Queue<VertexType> Q = new LinkedList<VertexType>();
        HashMap<VertexType, VertexType> gcopy2g = new HashMap<VertexType, VertexType>();
        HashMap<Integer, VertexType> t = new HashMap<Integer, VertexType>();
        for (VertexType type : gcopy)
            t.put(type.getId(), type);
        for (VertexType type : g)
            gcopy2g.put(t.get(type.getId()), type);
        for (int i = 0; i < dist.length; i++)
            dist[i] = Integer.MAX_VALUE;

        dist[v.getId()] = 0;

        for (VertexType u : gcopy) {
            if (gcopy.getInDegree(u) == 0) {
                Q.add(u);
            }
        }

        while (!Q.isEmpty()) {
            VertexType u = Q.poll();
            Iterator<EdgeType> iet = gcopy.edgeIterator(u);
            while (iet.hasNext()) {
                EdgeType e = iet.next();
                if ((dist[u.getId()] + e.getWeight()) < dist[e.target.getId()]) {
                    dist[e.target.getId()] = dist[u.getId()] + e.getWeight();
                    prev.add(e.target.getId(), u);
                    dispatchEvent(new PreWorkEvent<VertexType, EdgeType>(gcopy2g.get(e.target), gcopy2g.get(u), gcopy));
//                    System.out.println(e.target.getId());
                }
                if (gcopy.getInDegree((VertexType) e.target) == 1)
                    Q.add((VertexType) e.target);
            }
            gcopy.removeVertex(u);
        }
        return prev;
    }