不相交路径算法

时间:2017-01-19 21:24:44

标签: python algorithm path disjoint-sets

查找扩充路径的最简单方法是什么?

使用标记遍历计算边缘不相交路径以查找扩充路径

def paths(G, s, t):                           # Edge-disjoint path coun
    H, M, count = tr(G), set(), 0             # Transpose, matching, result
    while True:                               # Until the function returns
        Q, P = {s}, {}                              # Traversal queue + tree
        while Q:                                    # Discovered, unvisited
            u = Q.pop()                             # Get one
            if u == t:                              # Augmenting path!
                count += 1                     # That means one more path
                break                               # End the traversal
            forw = (v for v in G[u] if (u,v) not in M)  # Possible new edges
            back = (v for v in H[u] if (v,u) in M)  # Cancellations
            for v in chain(forw, back):       # Along out- and in-edges
                if v in P: continue           # Already visited? Ignore
                P[v] = u                            # Traversal predecessor
                Q.add(v)                            # New node discovered
        else:                                       # Didn't reach t?
            return count                            # We're donefinnish

我可以使用I while循环来芬兰语以及如何使用?

1 个答案:

答案 0 :(得分:0)

我试过这个并且有效!

while u != s:    
    u, v = P[u], u
    if v in G[u]:
        M.add((u,v))
else:
    M.remove((v,u))