【python】输出二分图的所有可能匹配
程序员文章站
2024-02-14 18:53:34
...
问题:
二分图中左边集合有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]]]
推荐阅读