在无向图

时间:2016-12-26 19:09:03

标签: python algorithm optimization graph-theory

我有一个形容词矩阵和一个可以使用其中的一个形容词列表(我也可以使用它们)。

基本上,我如何配对图中连接的顶点,以便保留最少的不成对(和断开连接)顶点?

我尝试过这种蛮力战略:

def max_pairs(adj_matrix):
    if len(adj_matrix) % 2:
        # If there are an odd amount of vertices, add a disconnected vertex
        adj_matrix = [adj + [0] for adj in adj_matrix] + [0] * (len(adj_matrix) + 1)
    return max(adj_matrix)

def all_pairs(adj_matrix):
    # Adapted from http://stackoverflow.com/a/5360442/5754656
    if len(adj_matrix) < 2:
        yield 0
        return
    a = adj_matrix[0]
    for i in range(1, len(adj_matrix)):
        # Recursively get the next pairs from the list
        for rest in all_pairs([
              adj[1:i] + adj[i+1:] for adj in adj_matrix[1:i] + adj_matrix[i+1:]]):
            yield a[i] + rest  # If vertex a and i are adjacent, add 1 to the total pairs

对于较小的图形,这是正常的,但我正在使用的图形最多有100个顶点。

有没有办法优化它,以便它可以处理那么大的图形?

这是另一个有算法的问题的同义词吗?我搜索了“大多数非交叉k循环”及其变体,但找不到算法来做到这一点。

1 个答案:

答案 0 :(得分:1)

有多项式时间解决方案(它适用于O(|V|^2 * |E|))。它被称为Blossom algorithm。我们的想法是在二分图中进行匹配,但也将奇数长度的周期缩小为一个顶点。