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)
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)
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)