Beispiel #1
0
def spanning_tree(tree, preserve):
    """ Return a new DiGraph with the spanning tree including the desired nodes.
    preserve: the set of nodes that delimit the spanning tree. """
    spanning = DiGraph()
    preserve = set(preserve)  # duplicate, will be altered
    if 1 == len(preserve):
        spanning.add_node(iter(preserve).next())
        return spanning

    if len(tree.successors(find_root(tree))) > 1:
        tree = tree.copy()
        # First end node found
        endNode = (node for node in tree
                   if not next(tree.successors_iter(node), None)).next()
        reroot(tree, endNode)

    n_seen = 0

    # Start from shortest sequence
    for seq in sorted(partition(tree), key=len):
        path = []
        for node in seq:
            if node in preserve:
                path.append(node)
                if node not in spanning:
                    n_seen += 1
                if len(preserve) == n_seen:
                    break
            elif path:
                path.append(node)

        if path:
            spanning.add_path(path)
            if seq[-1] == path[-1]:
                preserve.add(path[-1])

        if len(preserve) == n_seen:
            break

    return spanning
Beispiel #2
0
def spanning_tree(tree, preserve):
    """ Return a new DiGraph with the spanning tree including the desired nodes.
    preserve: the set of nodes that delimit the spanning tree. """
    spanning = DiGraph()
    preserve = set(preserve) # duplicate, will be altered
    if 1 == len(preserve):
        spanning.add_node(iter(preserve).next())
        return spanning

    if len(tree.successors(find_root(tree))) > 1:
        tree = tree.copy()
        # First end node found
        endNode = (node for node in tree if not next(tree.successors_iter(node), None)).next()
        reroot(tree, endNode)

    n_seen = 0

    # Start from shortest sequence
    for seq in sorted(partition(tree), key=len):
        path = []
        for node in seq:
            if node in preserve:
                path.append(node)
                if node not in spanning:
                    n_seen += 1
                if len(preserve) == n_seen:
                    break
            elif path:
                path.append(node)

        if path:
            spanning.add_path(path)
            if seq[-1] == path[-1]:
                preserve.add(path[-1])

        if len(preserve) == n_seen:
            break

    return spanning