def eppstein_ksp(self,
                     G: DiGraph,
                     source: Any,
                     target: Any,
                     K: int = 1,
                     weight="weight") -> List[NamedTuple]:

        self.target = target
        T = ConstructShortestPathTree(
            G.reverse(), target, weight=weight)  # reversed shortest path tree
        self.setDelta(G, T, weight=weight)
        nodeHeaps = dict()
        outrootHeaps = dict()

        for node in G.nodes():
            self.computeH_out(node, G, nodeHeaps, weight=weight)

        rootArrayHeap = EppsteinArrayHeap()
        self.computeH_T_recursive(target, rootArrayHeap, nodeHeaps,
                                  outrootHeaps, T)

        hg = EppsteinHeap(Edge(source, source, weight=0))
        ksp = []
        pathPQ = []
        heappush(pathPQ, EppsteinPath(hg, -1, T.nodes()[source]["distance"]))
        k = 0

        while k < K and pathPQ:
            # Checked
            kpathImplicit = heappop(pathPQ)
            kpath = kpathImplicit.explicitPath(G,
                                               T,
                                               ksp,
                                               target,
                                               weight=weight)
            ksp.append(kpath)
            self.addHeapEdgeChildrenToQueue(kpathImplicit, ksp,
                                            pathPQ)  # heap edge
            self.addCrossEdgeChildToQueue(outrootHeaps, kpathImplicit, k, ksp,
                                          pathPQ)  # cross edge
            k += 1

        return ksp