匈牙利匹配

理论知识网上有很多,只根据代码解析下:
矩阵为:(每一列代表一个男生,每一行代表一个女生,1代表匹配,0代表不匹配)
0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 \begin{matrix} 0 & 0 & 0 & 1 & 1 & 1 \\ 0 & 0 & 0 & 1 & 0 & 1 \\ 0 & 0 & 0 & 1 & 0 & 0 \\ 1 & 1 & 1 & 0 & 0 & 0 \\ 1 & 0 & 0 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 & 0 & 0 \end{matrix} 000111000101000100111000100000110000
1.id=0的男生和id=3的女生匹配,再去找id=1的男生,发现与id=3也匹配,对id=0的男生重新寻找,找到id=4的女生匹配。
2.id=2的男生和id=3的女生匹配,发现id=1的男生与id=3匹配,对id=1的男生重新寻找,找到id=5的女生匹配,且id=5的女生还未和其他人建立匹配。
3.依次类推,直至建立所有匹配关系。

class Hungary():
    def __init__(self,graph):
        self.graph = graph
        self.n = len(graph)
        self.used = None
        self.nxt = None
        
    def find(self,x):
        for i in range(self.n):
            if self.graph[i][x] == 1 and self.used[i] == 0:
            	# 找到满足匹配关系且还没有建立匹配的对象
                self.used[i] = 1
                # 还未建立匹配关系或者男生还有别的匹配对象
                if self.nxt[i] == -1 or self.find(self.nxt[i]):
                	# 保存男生匹配id和女生匹配id
                    self.nxt[x] = i
                    self.nxt[i] = x
                    return True
        return False

    def match(self):
        self.used = [False] * self.n
        self.nxt = [-1] * self.n
        for i in range(self.n):
            if self.nxt[i] == -1:
            	# self.used初始化
                self.used = [False] * self.n
                self.find(i)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值