算法学习——匈牙利算法

匈牙利算法——二分图资源分配问题

import numpy as np
def hungarian_algorithm(graph):
    def dfs(u):
        for v in range(N):
            # 如果两点之间有联系并且该点(列)未被访问
            if graph[u][v] and  not visited[v]:
                # 记录状态为访问过
                visited[v] = True
                # 如果节点v尚未匹配,或者节点v已经匹配但可以找到一条从节点v出发的另外一条路径,
                # 那么就说明节点u可以与节点v进行匹配。
                if match[v] == -1 or dfs(match[v]):
                    match[v] = u
                    return True
        return False

    M, N = graph.shape
    match = [-1] * N #-1代表两点之间没有匹配
    max_matching = 0 #初始化max_matching

    for i in range(M):
        # 初始化访问数组
        visited = [False] * N
        # 调用深度优先搜索(DFS),有匹配的点就+1
        if dfs(i):
            max_matching += 1
    # N代表列
    matching_result = [-1] * N
    for j in range(N):
        # 检查其是否与某个左侧节点匹配
        if match[j] != -1:
            # 将matching_result中与该右侧节点匹配的左侧节点标记为j。
            matching_result[match[j]] = j

    return max_matching, matching_result

# 示例用法
graph = np.array([[0, 1, 0, 1],
                  [1, 0, 1, 0],
                  [0, 1, 0, 1],
                  [1, 0, 1, 0]])

matching_count, matching_result = hungarian_algorithm(graph)
print("最大匹配数量:", matching_count)
print("最大匹配结果:", matching_result)

实现结果:
在这里插入图片描述

参考学习链接:
算法学习笔记(5):匈牙利算法 - Pecco的文章 - 知乎
https://zhuanlan.zhihu.com/p/96229700

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值