示例#1
0
def sensitive(G: Graph, s: str, t: str) -> Tuple[str, str]:
    """
    Sig:  Graph G(V,E), str, str -> Tuple[str, str]
    Pre:
    Post:
    Ex:   sensitive(g1, 'a', 'f') = ('b', 'd')
    """

    GRes = Graph(is_directed=True)
    for (u, v) in G.edges:
        # Variant: len(G.edges) - G.edges.index((u, v))
        residual = G.capacity(u, v) - G.flow(u, v)

        if residual == 0:
            GRes.add_edge(v, u, capacity=G.capacity(u, v))
        elif residual == G.capacity(u, v):
            GRes.add_edge(u, v, capacity=G.capacity(u, v))
        else:
            GRes.add_edge(u, v, capacity=residual)
            GRes.add_edge(v, u, capacity=G.flow(u, v))

    reachable = set()
    dfs(GRes, s, reachable)

    for (u, v) in G.edges:
        # Variant: len(G.edges) - G.edges.index((u, v))
        if u in reachable and v not in reachable:
            return (u, v)

    return (None, None)
示例#2
0
def dfs_residual(G: Graph, R: Graph, node: str, nodes: Set[str]):
    nodes.add(node)
    for neighbor in G.neighbors(node):
        capacity = G.capacity(node, neighbor)
        flow = G.flow(node, neighbor)
        R.add_edge(neighbor, node, capacity=flow, flow=0)
        if neighbor not in nodes:
            dfs_residual(G, R, neighbor, nodes)
示例#3
0
def dfs_find_reachable(R: Graph, node: str, reachable: Set[str]):
    reachable.add(node)
    for neighbor in R.neighbors(node):
        avalable_capacity = R.capacity(node, neighbor) - R.flow(node, neighbor)
        if (neighbor not in reachable and avalable_capacity != 0):
            dfs_find_reachable(R, neighbor, reachable)