我有一个形容词矩阵和一个可以使用其中的一个形容词列表(我也可以使用它们)。
基本上,我如何配对图中连接的顶点,以便保留最少的不成对(和断开连接)顶点?
我尝试过这种蛮力战略:
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循环”及其变体,但找不到算法来做到这一点。
答案 0 :(得分:1)
有多项式时间解决方案(它适用于O(|V|^2 * |E|)
)。它被称为Blossom algorithm。我们的想法是在二分图中进行匹配,但也将奇数长度的周期缩小为一个顶点。