二分图匹配算法

二分图匹配算法是一种用于解决二分图最大匹配问题的算法。

二分图:

在圖論中,二部圖bipartite graph)是一類特殊的圖,又稱為、偶图雙分圖。二分圖的頂點可以分成兩個互斥的独立集 U 和 V 的圖,使得所有邊都是連結一個 U 中的點和一個 V 中的點。頂點集 U、V 被稱為是圖的兩個部分。等價的,二分圖可以被定義成圖中所有的環都有偶數個頂點

 

 

匹配 :

匹配是指将一个二分图中的左部顶点和右部顶点之间进行连线的一种关系。具体来说,匹配可以表示为二维数组 match,其中 match[i] 表示左部第 i 个顶点匹配到了右部的哪个顶点。如果 match[i] 为 -1,则表示左部第 i 个顶点没有匹配。

最大匹配 :

对于一个二分图可能有多种匹配,如果二分图里的某一个匹配包含的边的数量,在该二分图的所有匹配中最大,那么这个匹配称为 最大匹配

二分图匹配问题就是在给定的二分图中,找到最多的一对对顶点进行匹配,使得尽可能每个顶点都有一个匹配。

以下是一个例子:

假设有一个二分图,分为左部和右部

 

复制代码

左部: A B C D
右部: X Y Z

我们可以用一个二维数组 match 来表示匹配情况,其中 match[i] 表示左部第 i 个顶点匹配到了右部的哪个顶点。初始时,数组全部为 -1,表示还没有匹配。

那么,如何使用二分图匹配算法来解决这个问题呢?

贪心二分图匹配算法

输入:

  • score: 一个 n×n 的分数矩阵,表示左部和右部每对顶点之间的匹配分数
  • n: 左部或右部的顶点数

输出:

  • match: 一个长度为 n 的匹配数组,表示左部和右部每个顶点之间的匹配关系
import numpy as npdef GreedyBipartiteMatching(score, n):match = np.zeros(n, dtype=int)# 遍历每一列,贪心地选择当前未匹配的分数最大的行for col in range(n):max_row = -1max_score = -float('inf')for row in range(n):if match[row] == 0 and score[row, col] > max_score:max_row = rowmax_score = score[row, col]if max_row >= 0:match[max_row] = colreturn match

主要思路是:

  1. 遍历每一列,也就是右部的每个顶点
  2. 在未匹配的左部顶点中,找到与当前右部顶点的匹配分数最大者
  3. 将这一对作为匹配结果

这样我们仍然可以在O(n^2)时间内求解,而不需要提前排序。

这个实现更简洁直观,去掉了排序的步骤。同时时间复杂度也保持不变。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/18461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人科普--AGILOX 叉车

机器人科普--AGILOX 叉车 1 概述2 导航3 驱动轮组4 叉举参考 1 概述 AGILOX 叉车,不需要画地图路径,很厉害。 2 导航 中间路径自由导航,末端规划出轨迹路线,并使用优良的控制器做轨迹追踪。 AGILOX | 10 Min setu…

ubuntn 18.04安装SourceInsight3.5(已验证)

Source Insight作为一款看代码神器在大型c、c项目中必不可少,但是Source Insight软件并不支持Linux操作系统,只支持Windows操作系统。 想要在linux系统上安装window软件就需要借助wine,wine 是一个能够在多种 POSIX-compliant 操作系…

Spring依赖注入

文章目录 前言1.依赖注入简介2. setter注入3. 构造器注入4. 自动装配 总结 前言 为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚&#xff0…

商城免费搭建之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c bbc

 1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、R…

TCP拥塞控制详解 | 1. 概述

网络传输问题本质上是对网络资源的共享和复用问题,因此拥塞控制是网络工程领域的核心问题之一,并且随着互联网和数据中心流量的爆炸式增长,相关算法和机制出现了很多创新,本系列是免费电子书《TCP Congestion Control: A Systems …

vue3搭建Arco design UI框架

技术:Vue3.2.40 UI框架:Arco design 2.44.7 需要安装:yarn 1.22.19 和npm 8.19.4 1.第一步安装本地全局arco脚手架 管理员运行CMD npm i -g arco-cli安装成功后如下: 2.第二步在需要存放项目的文件夹拉取项目 我这里把项目存放在 D:\W…

BCD编码方案

1.BCD码的原理 BCD码(Binary-Coded Decimal)是一种用二进制数来编码十进制数字的方式。BCD码使用4位二进制数来表示一个十进制数的每一位。 2.8421码映射 8421码是BCD码的一种实例化。 01234567890000000100100011010001010110011110001001 因此132…

计算机网络基础(静态路由,动态路由,公网IP,私网IP,NAT技术)

文章目录 一:静态路由和动态路由二:静态路由的配置路由信息的方式演示三:默认路由四:公网IP和私网IP和NAT技术的基本理解 一:静态路由和动态路由 在说静态路由和动态路由前,我们需要来了解一下&#xff0…

【Windows】磁盘快捷修复

【Windows】磁盘快捷修复 1、背景2、关于Chkdsk3、示例 1、背景 前段时间使用U盘拷贝文件过程中,突然发现U盘无法读取了,U盘里面存储的数据也无法获取。 然后使用windows系统的chkdsk命令进行修复。 chkdsk全称:checkdisk,即磁盘…

【 Redis】的乱码问题

问题描述: 使用RedisTemplate存储的数据,在 redis-cli 客户端查看时,key 和 value 都会携带类似\xac\xad\这样的字符串。 原因: 由于默认使用了 jdk 的序列化方式。以下是支持的序列化方式 项目一般都会有缓存,常常…

go练习 day01

DTO: note_dto.go package dtoimport "king/model"type NoteAddDTO struct {ID uintTitle string json:"title" form:"title" binding:"required" message:"标题不能为空"Content string json:"conten…

Matlab实现AGNES算法

在数据分析和机器学习中,聚类是一种常用的无监督学习方法,它可以将数据点按照某种相似度标准进行分组,从而发现数据中的结构和模式。聚类算法有很多种,其中一种比较经典的是AGNES算法,它是一种基于层次的聚类算法&…

Live Market做世界C端用户数据的耕耘,数据和流量的价值呈现

在数字化时代,数据成为了推动经济增长和商业发展的重要资源,而流量则是数据价值的体现和传递媒介。随着全球互联网的普及和移动设备的智能化,C端用户数据的收集和分析变得尤为重要。在这个领域,有一家专注于世界C端用户数据耕耘的…

分享18个用于处理 null、NaN 和undefined 的 JS 代码片段

🎬 岸边的风:个人主页 🔥 个人专栏:《 VUE 》 《 javaScript 》 ⛺️生活的理想,就是为了理想的生活! 目录 前言 内容 📟 1. 检查是否为null: 📟 2. 检查undefined: &#x1…

【3D捏脸功能实现】

文章目录 一、技术方案介绍二、技术核心三、底层技术实现选型进行模型建模编写逻辑代码 四、功能落地五、总结 一、技术方案介绍 3D捏脸功能是一种利用3D技术实现用户自定义头像的功能。通常实现这种功能需要以下技术: 3D建模技术。通过3D建模技术可以创建一个可以…

【uniapp 样式】使用setStorageSync存储历史搜索记录

<template><view><view class"zhuangbox u-flex"><u--inputplaceholder"请输入关键字搜索"border"surround"shapecircleprefixIcon"search"prefixIconStyle"font-size: 22px;color: #909399"v-model&q…

Linux | VIM | 常用vim快捷键(建议收藏)

文章目录 Linux | VIM | 常用vim快捷键一、移动光标二、删除复制三、插入模式四、编辑五、查找替换六、退出编辑器七、多文件编辑八、多标签编辑九、执行shell命令十、VIM启动项十一、自动排版十二、如何在vim中编译程序十三、buffer操作buffer状态 十四、 VIM 操作目录1.打开目…

重新登录成功和登录失败处理器

<template><div class="login"><el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form"><h3 class="title">Java1234 Vue3 后台管理系统</h3><el…

测试|LoadRunner安装及介绍

测试|LoadRunner安装及介绍 文章目录 测试|LoadRunner安装及介绍1.什么是LoadRunner2.LoadRunner特点3.LoadRunner基本概念4.LoadRunner三大组件之间关系LoadRunner安装1.安装包2.安装loadrunner 1.什么是LoadRunner LoadRunner是用来模拟用户负载完成性能测试的工具。 它适用…

重新理解 RocketMQ Commit Log 存储协议

最近突然感觉&#xff1a;很多软件、硬件在设计上是有 root reason 的&#xff0c;不是 by desgin 如此&#xff0c;而是解决了那时、那个场景的那个需求。一旦了解后&#xff0c;就会感觉在和设计者对话&#xff0c;了解他们的思路&#xff0c;学习他们的方法&#xff0c;思维…