You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻找无重叠元素的最长配对组合长度的高效解法

问题解法:无公共元素的最长配对组合

问题建模

你描述的问题本质是无向图的最大匹配问题:

  • 将每个唯一元素视为图的一个顶点
  • 将每个配对视为连接两个顶点的无向边
  • 我们需要找出包含最多边数的边子集,其中任意两条边没有公共顶点——这个子集的大小就是你要的最长组合长度。

高效解法选择

针对你的约束条件(唯一元素≤100,配对数≤数千),Edmonds算法是最优选择之一,时间复杂度为O(VE)(V是顶点数,E是边数),完全能处理给定规模的输入,效率远高于暴力枚举。

如果你的配对天然能分成两个不相交的元素集合(比如二分图场景),也可以用Hopcroft-Karp算法(O(E√V)),但Edmonds算法适用于所有无向图场景,通用性更强。

实现示例(Python)

首先将元素映射为整数顶点,再构建邻接表,最后实现Edmonds算法的核心逻辑:

def max_pair_combination_length(pairs):
    # 第一步:将所有唯一元素映射为整数编号
    elements = set()
    for a, b in pairs:
        elements.add(a)
        elements.add(b)
    elem_to_idx = {elem: idx for idx, elem in enumerate(elements)}
    n = len(elem_to_idx)
    
    # 第二步:构建邻接表(去重避免重复处理相同配对)
    graph = [[] for _ in range(n)]
    unique_pairs = set((min(a,b), max(a,b)) for a,b in pairs)
    for a, b in unique_pairs:
        u = elem_to_idx[a]
        v = elem_to_idx[b]
        graph[u].append(v)
        graph[v].append(u)
    
    # 第三步:Edmonds算法实现最大匹配
    match_to = [-1] * n  # 记录每个顶点的匹配顶点,-1表示未匹配
    result = 0

    def dfs(u, visited):
        for v in graph[u]:
            if not visited[v]:
                visited[v] = True
                if match_to[v] == -1 or dfs(match_to[v], visited):
                    match_to[u] = v
                    match_to[v] = u
                    return True
        return False

    for u in range(n):
        if match_to[u] == -1:
            visited = [False] * n
            if dfs(u, visited):
                result += 1
    return result

# 测试示例
sample_pairs = [('A', 'B'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]
print(max_pair_combination_length(sample_pairs))  # 输出:2

关键说明

  1. 元素映射:将字符串/其他类型的元素转为整数,是为了简化算法中的数组操作。
  2. 配对去重:确保相同的配对(如(A,B)和(B,A))只被处理一次,避免冗余计算。
  3. DFS增广路径:算法核心是通过深度优先搜索寻找"增广路径",不断扩大匹配的规模,直到无法找到新的增广路径为止,此时的匹配数就是最大可能的组合长度。

内容的提问来源于stack exchange,提问作者Eleanor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 00:49:01