def get_steiner(self, query_elements, lefts):
     """
     dynamic programming for steiner tree problem
     """
     subpaths, root = steiner(self.undirected_graph._graph, query_elements, \
             self.undirected_graph.d, \
             self.undirected_graph.PT)
     n = len(self.undirected_graph._graph)
     lk_set = set([])
     for lk in subpaths:
         ll, rr = lk
         lk_set.add(lk)
         if (rr, ll) in lk_set:
             lk_set.remove(lk)
     sub_span = [[] for _ in self.undirected_graph._graph ]
     for i, j in lk_set:
         sub_span[i].append((j, 0))
         sub_span[j].append((i, 0))
     subtree = RootedWGraph(sub_span, root)
     root = subtree.root_index
     if root in lefts:
         _LOGGER.debug("swith_root")
         subtree.switch_root(lefts)
     return subtree