【python】输出二分图的所有可能匹配

问题:

二分图中左边集合有m个节点,分别标号为0,1,...,m-1;右边集合有n个节点,分别标号为0,1,...,n-1。以list的形式输出这两个集合中以左边集合节点为中心的所有可能的匹配集。(必须给每个左边节点分配一个右边节点,相当于把m个鸡蛋放进n个篮子里,但是篮子中可放鸡蛋个数没有限制,求所有可能的整体分配情况)

思路:

如果直接利用排列组合分情况讨论,如m<n, m=n, m>n, m>2n,需要考虑很多种情况太复杂。

利用python强大的itertools包,先求出左边单个节点的所有可能匹配集1,再在输入匹配集1的基础上求出匹配集1中的所有可能匹配集2。

示例:

def run(left, right):
    from collections import defaultdict
    from itertools import product
    
    list1 = []
    for i in left:
        for j in right:
            temp_list = []
            temp_list.append(i)
            temp_list.append(j)
            list1.append(temp_list)
    print("list1:")
    print(list1, "\n") 

    list2 = []
    for i in range(len(left)):
        list2.append(list1[i*len(right) : (i+1)*len(right)])
    print("list2:")
    print(list2, "\n")
    
    list3 = []
    for i in product(*list2):
        list3.append(list(i))
    print("list3:")
    print(list3, "\n")

    return list3

m = 3
n = 2
left = range(m)
right = range(n)
result_list = run(left, right)
list1:
[[0, 0], [0, 1], [1, 0], [1, 1], [2, 0], [2, 1]] 

list2:
[[[0, 0], [0, 1]], [[1, 0], [1, 1]], [[2, 0], [2, 1]]] 

list3:
[[[0, 0], [1, 0], [2, 0]], [[0, 0], [1, 0], [2, 1]], [[0, 0], [1, 1], [2, 0]], [[0, 0], [1, 1], [2, 1]], [[0, 1], [1, 0], [2, 0]], [[0, 1], [1, 0], [2, 1]], [[0, 1], [1, 1], [2, 0]], [[0, 1], [1, 1], [2, 1]]] 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值