二分图/二分图最大匹配(匈牙利算法)

二分图匹配算法总结1 最大独立集问题: 在N个点的图 G 中选出 m 个点,使这 m 个点两两之间没有边.求 m 最大值.如果图G满足二分图条件,则可以用二分图匹配来做.最大独立集点 立即下载

        

二分图

  1. 定义

图为二分图当且仅当图中不存在奇数环

简单证明一下:

a08da34c2d424f10a493737ee3ffd6aa.png

 

 

我们把这些点分为两个集合 假设1为集合1 那么2为集合2 集合3为集合1  1为集合2

矛盾!!!所以不能出现奇数环

二分图的判定方法

dfs染色法

我们任意选择起点然后染其邻接点(邻接点染为相反颜色) 表示两个集合 如果出现矛盾那么就不是二分图(当前染的点的邻接点有颜色 但是和当前点的颜色相同 这就是矛盾) 用图模拟下:

 

607a7f63178d4f8398a8441ea2e5aa4c.png首先把任意一个点染为黑色 

 

874894ce69234020bbb25db421ebd976.png那么它的邻接点都是白色

29ea1fe7b2ee4ff7af3793175551c7da.png  然后白色邻接点都是黑色 这就是一个完美的二分图!!!

 

Code:

#include<bits/stdc++.h>

using namespace std;

const int N=10010;

int h[N],e[N],ne[N],color[N],idex,n,m;

void add(int a,int b){

e[idex]=b;

ne[idex]=h[a];

h[a]=idex++;

} //邻接表建立二分图

bool dfs(int x,int c){

color[x]=c;//c表示当前颜色

for(int i=h[x];i!=-1;i=ne[i]){//遍历其邻接点

if(!color[e[i]]){//如果没有被染色就染为相反的颜色

if(!dfs(e[i],3-c))return false;//邻接点染为相反颜色出现矛盾

}

else if(color[e[i]]==c)return false;//当前点出现矛盾

}

return true;

}

int main(){

memset(h,-1,sizeof(h));

cin>>n>>m;

int a,b;

while(m--){

cin>>a>>b;

add(a,b),add(b,a);

}

bool flag=true;

for(int i=1;i<=n;i++){

if(!color[i]){

if(!dfs(i,1))flag=false;

}

}

if(flag)cout<<"yes"<<endl;

else cout<<"no"<<endl;

}

应用

匈牙利最大匹配图:

因为二分图可以看成两个集合所以就可以把图看下图:

776e3c1e138144ef94aa1e2a85f21a2f.png

左为集合1右为集合2 那么二分图的匹配就是 左边集合的点对应一个右边集合的点 而且

右边集合只能对应一个左边的点(一一对应) 最大匹配就是左边最多几个点和左边的一一匹配

简单介绍一下匈牙利算法

从左边最上面的点开始加入左1匹配了右1到左2的时候2只能匹配右1 那么我们回溯到左1看左1是否有其他点可以匹配 如果有那么让左1匹配其他点 然后左2匹配右1(大体思路就是这样)

Code:

#include<bits/stdc++.h>

using namespace std;

const int N=510,M=100010;

int n1,n2,m;

int h[N],e[M],ne[M],idex;

int match[N];//记录右边的点匹配的是哪一个点

bool st[N];//标记当前点是否被考虑过;

void add(int a,int b){

e[idex]=b;

ne[idex]=h[a];

h[a]=idex++;

}

bool Find(int x){

for(int i=h[x];i!=-1;i=ne[i]){

if(!st[e[i]]){

st[e[i]]=true;

if(!match[e[i]]||Find(match[e[i]])){

match[e[i]]=x;

return true;

}

}

}

return false;

}

int main(){

cin>>n1>>n2>>m;

memset(h,-1,sizeof(h));

int a,b;

while(m--){

cin>>a>>b;

add(a,b);

}

int ans=0;

for(int i=1;i<=n1;i++){

memset(st,0,sizeof(st));

if(Find(i))ans++;

}

cout<<ans<<endl;

}

 

 

详解电路设计中的RC电路 ​ 一、什么是RC电路 RC电路是指由电阻R和电容C组成的电路,它是脉冲产生和整形电路中常用到 的电路。 常见的RC充、放电电路、RC积分电路合RC微分电路接下来详细讲解。 二、RC充、放电电路 RC充、放电电路如下图所示,下面通过充电和放电两个过程来分析此电路。 ​RC充、放电电路图 (1)RC充电电路 RC充电电路图如下图(a)所示 RC充电电路图及充电曲线图 ​由上图分析: 将上图a中开关S置于“1”处,电源E开始通过电阻R对电容C充电,由于刚开始充电时电容两端没有.. 阅读详情

相关推荐

用Python和CasADi实现高斯伪谱法:一个轨迹优化问题的保姆级教程

本文详细介绍了如何使用Python和CasADi框架实现高斯伪谱法解决轨迹优化问题。通过保姆级教程,从环境准备、问题建模到高斯伪谱法的核心实现,包括配点与权重计算、微分矩阵构造和动力学约束实现,最终完成问题求解与结果可视化。适用于机器人轨迹规划和无人机路径优化等工程场景。

weixin_30776273的博客 293

我对KM算法的理解

一般对KM算法的描述,基本上可以概括成以下几个步骤: (1) 初始化可行标杆 (2) 用匈牙利算法寻找完备匹配 (3) 若未找到完备匹配则修改可行标杆 (4) 重复(2)(3)直到找到相等子图的完备匹配 关于该算法的流程及实施,网上有很多介绍,基本上都是围绕可行标杆如何修改而进行的讨论,至于原理并没有给出深入的探讨。 KM算法是用于寻找带权二分图最佳匹配的算法。 二分图是...

茅屋 2812

centos 添加新硬盘,对根目录扩容

本地安装了虚拟机,系统为centos7,使用过程中,渐渐地发现磁盘容量不够用了,于是在虚拟机中新增了一块硬盘。 进入系统内查看: sdb是新增的硬盘,大小为40g。 接下来有两种方式,一种是普通方式直接挂载。https://blog.youkuaiyun.com/qq_39314099/article/details/106200322 这样的话只有在挂载点的目录下操作才能使用到这个新硬盘,不是很理想。 还有一种方式lvm,逻辑卷管理的方式。 LVM简单介绍: 它是 Linux 下对磁盘分区进行管

qq_39314099的博客 1万+

二分匹配算法

目录学习篇二分图以及其最大匹配匈牙利算法二分图最大匹配变形题最小顶点覆盖 || 最大独立集DAG图的最小路径覆盖水题集hdu 2063:男女最大匹配hdu 1150:机器最少重启次数hdu 1151:DAG最小覆盖路1068:最大没有联系的男女个数hdu 1281 :骑士最大放置数 学习篇 二分图以及其最大匹配 一、什么是二分图 如果一个图的顶点可以分为两个集合X、Y, 图的所有边一定是有一个顶点属于集合X,另一个顶点属于集合Y, 则称该图为“二分图”或“二部图”。 二、二分图的最大匹配 在二分图的应用中,

weixin_52723996的博客 1273

FreeCAD地下管道自动化建模实战:Python脚本从入门到导出OBJ

本文详细介绍了如何利用FreeCAD的Python API实现地下管道的自动化建模,从数据处理到模型导出OBJ格式的全流程。通过实战案例和代码示例,展示了圆形和矩形截面管道的创建方法,以及法兰连接等特殊处理技巧,大幅提升工程设计效率。

ff678的博客 248

基于深度学习YOLOv8的花卉检测与识别系统(附完整资源+PySide6界面+训练代码)

通过本项目,我们成功实现了基于YOLOv8的花卉检测与识别系统,涵盖了数据预处理、模型训练、推理与实时检测、以及GUI界面的实现。YOLOv8在花卉检测中的高效性和准确性为实际应用提供了强有力的支持。

斌擎科技 716

【算法详解】 二分图及其匹配

一、二分图基础 什么是二分图? 如果一个无向图可以分为两个不同的集合A,BA,BA,B, 使得集合A,BA,BA,B内部的点中没有边相连,只存在AAA集合中的点连向BBB集合中的点或者相反。 这样的图成为无向图 无向图上的基本术语/概念 一、二分图的匹配:选取二分图中的边集SSS,当且仅当集合中的任意两条边都没有共同公共端点时,S为二分图的一个匹配 二、匹配边/未匹配边:在集合S...

鹭天 1929

使用RV1126实现人脸识别——将Facenet模型转换为RKNN模型

在本文中,我们将探讨如何在RV1126芯片上实现人脸识别,并将Facenet模型转换为RKNN(Rockchip Neural Network)模型,以在RV1126上进行高效的人脸识别。Fine-tuning是指在预训练模型的基础上,使用自己的数据集进行进一步训练,以适应特定的任务。同时,我们需要下载Facenet模型的预训练权重,这些权重将作为我们的基础模型。综上所述,我们详细介绍了如何在RV1126上实现人脸识别,并将Facenet模型转换为RKNN模型。方法将模型导出为RKNN格式的文件。

code_program481的博客 1522

二分图匹配算法

匈牙利算法、Hopcroft-Karp算法和Kuhn-Munkres算法是三种常见的二分图匹配算法,它们在实现方式、时间复杂度和适用场景上有所差异。以下是它们的区别和优缺点: 匈牙利算法: 实现方式:匈牙利算法使用深度优先搜索(DFS)来寻找增广路径,通过不断更新匹配的顶点对来找到最大匹配。 时间复杂度:匈牙利算法的时间复杂度为O(VE),其中V是顶点数,E是边数。 优点:实现简单,易于理...

一抹烟霞的博客 1509

ANSYS Fluent:湍流模型理论与应用

雷诺平均方程(RANS,Reynolds-Averaged Navier-Stokes equations)是湍流建模中最常用的方法。它通过将Navier-Stokes方程中的瞬时速度分解为平均速度和脉动速度,然后对这些方程进行时间平均,从而简化了湍流的计算。RANS方法的关键在于湍流闭合问题的解决,即如何准确地表示脉动速度的统计量。雷诺应力模型(RSM)是一种更高级的湍流模型,它通过求解六个雷诺应力方程来描述湍流的各向异性。RSM模型能够更准确地预测复杂的湍流流动,如旋转流和分离流,但计算成本较高。

kkchenjj的博客 2946

【入门AUTOSAR网络管理测试】RSS-PBM状态转换

随着智能电动汽车行业的快速发展,目前AUTOSAR网络管理也得到了广泛应用,AUTOSAR网络管理测试也是汽车网络测试中非常重要的环节,NM问题导致的汽车ECU不能唤醒、电瓶亏电等问题,对于新入门AUTOSAR网络管理测试的同学不清楚如何开展测试,那么本章节就主要给大家介绍网络管理中RSS-PBM状态转换如何测试。【入门AUTOSAR网络管理测试】AUTOSAR网络管理规范需求解读。

测试领域技术分享 872

【洛谷P3386】二分图最大匹配之Kuhn算法/匈牙利算法:直观理解

本文介绍了匈牙利算法在二分图最大匹配问题中的应用。算法通过递归寻找增广路来分配物品,确保每个人尽可能获得自己喜欢的物品。文章详细解释了算法的递归过程和增广路的概念,并讨论了如何通过维护访问标记来避免无限循环。最后,提供了算法的C++实现代码,并强调了其时间复杂度和正确性。该算法的时间复杂度为O(|V||E|),适用于解决二分图最大匹配问题。

qaqwqaqwq的博客 2122

开源GIS -- 笔记

基础开发库 数据读写:GDAL/OGR(C/C++) ArcGIS和GE都是使用此工具 投影转换:Proj.4(C/C++) 拓扑计算:JTS(Java),GEOS(C++),Shapely(python) 组件式开发库 GeoTools(Java),DotSpatial(.NET) 空间分析: Scipy(通用科学计算、方程求解), numpy,NextworkX, rPy(统计分析), Scikit-learn,pysal(空间分析) 深度学习: Keras、 tensorflow、 pytor

DZ Space 4521

匈牙利算法求二分图的最大匹配/匈牙利算法模板

二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。 二分图的最大匹配: 匈牙利算法  完美匹配: 如果所有点都在匹配边上,称这个最大匹配是完美匹配。  最小覆盖: 最

TUT我好菜啊 1577

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

二分图最大匹配/匈牙利算法(落谷 2055 假期的宿舍)

题目连接 对于每个外校的、留校的本校生,都要匹配一个床,对于外校生,可以: 1.睡自己认识的人的床 对于每个留校本校生,可以: 1.睡自己的床 2.睡自己认识的人的床 由此建图,跑匈牙利算法,如果 最大匹配值==需要床的人数 则yes否则no 下面是ac代码: #include <iostream> #include <cstring> #include &lt...

平凡人Kalzn的博客 246

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Ural1109_Conference(二分图最大匹配/匈牙利算法/网络最大流)

解题报告 二分图第一题。 题目描述: 为了参加即将召开的会议,A国派出M位代表,B国派出N位代表,(N,M 会议召开前,选出K队代表,每对代表必须一个是A国的,一个是B国的; 要求每一个代表要与另一方的一个代表联系,除了可以直接联系,也可以电话联系,求电话联系最少 思路: 电话联系最少就要使直接联系最大,又是一一匹配关系,就是二分图的最大匹配。 下面是匈牙利算法。 #includ

_nplus 1178

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

HDU_1068 GirlsandBoys ( 二分图最大匹配/独立集 | 匈牙利算法 )

文章目录题意题解代码 题目连接 vj or hdu 题意 题解 代码

♡ 脚下的每一步都叫远方 ♡ 251

AcWing 861 二分图的最大匹配 题解 (匈牙利算法/渣男算法)

匈牙利算法匹配二分图(渣男算法)思路:遍历左边集合的每个点, 左侧点a1所连的右侧的点b1,如果右侧点b1已被匹配,看和他匹配的左侧点a2, 看能否从新给a2匹配一个没有匹配的点b2,如果可以就让a2和b2匹配,让a1和b1匹配,如果b1原本就没有匹配的点,就直接让a1和b1匹配,最终输出匹配的数量 #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using

qiaodxs的博客 415

二分图的最大匹配问题(匈牙利算法)

最近在研究二分图问题,有很多东东还是不熟悉!边学习边完善! 【二分图】图中的顶点可以分为两个不相交的点集u和v,因此,二分图中的每个边都是u中的一个点连接v中的一个点。因为u与v不相交,所以图中不存在环。 【二分图的匹配】给定一个二分图G,M为G边集的一个子集,如果M满足当中的任意两条边都不依附于同一个顶点,则称M是一个匹配。 【二分图的最大匹配】包含边数最多的匹配就是最大匹配。(比如,一个...

weixin_30340353的博客 187

数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配

无权图中,如何找到图中点与点之间的最短路径?(前提:有边 有权重)最大流问题是一种组合最优化问题,指的是如何充分利用装置的能力,使得运输的流量最大以取得最好的效果。1、构建残量图2、找一条简单路径,找到路径上的瓶颈值(当前路径所允许流过的最大流量),更新残量图路径权值,并将瓶颈值所在边擦除,重复该操作,直到无简单路径。1、构建残量图2、找一条简单路径,找到路径上的瓶颈值(当前路径所允许流过的最大流量),更新残量图路径权值,并将瓶颈值所在边擦除。3、添加反向路径上例左图为原图,根据原图可容易看出最大流为走s→

h0327x的博客 829

简单二分图判定与最大匹配算法

二分图基础。

wanglianda2007的博客 2273

每日四题打卡-4.2:最小生成树/染色法判定二分图/匈牙利算法-二分图的最大匹配

Prim算法求最小生成树 步骤: 1、距离初始化成正无穷 2、n次迭代-》找到集合外距离最近的点,赋值给t 3、用t更新其他点到集合的距离(跟狄杰斯塔拉不一样,狄杰斯塔拉是跟原点的距离),点与集合所有点距离最短的点:st[t] = true 给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数。 求最小生成树的树边权重之和,如果最小生成树不存在则输出impossib...

ai_XZP_master 324

二分图算法

显然,这题是需要用到二分图的,但是最终我们的答案是二分图减去匹配数/2,原因:首先,在我们匹配关系的时候,我们是将一个点拆分成两个点,假设此时有7个人进行匹配,那么我们匹配的时候相当于2n个,左边是n个男生,右边是n个女生,所以,最终匹配的个数应该是n-匹配数/2。3.标记之后,我们判断此时Bi是否已经配对,如果没有配对,那么就让Ai与Bi配对,否则,我们将Bi配对的Aii从1开始,判断Aii能否将此时的Bi让出来,让Aii与其他能够配对的B配对。2.此时,如果Bi已经被访问过,我们就返回1否则,就标记。

2301_80834940的博客 642

数据结构与算法 - 二分图匹配:匈牙利算法的应用场景

摘要: 本文深入探讨了二分图匹配问题及其经典解法——匈牙利算法。文章首先介绍了二分图的定义与性质,阐述了匹配问题在任务分配、课程选择等实际场景中的应用。随后详细解析匈牙利算法的核心思想,重点讲解了增广路径的概念及算法步骤,并通过Python代码实现演示了基于DFS的求解过程。最后,文章分析了算法的时间复杂度(O(VE))并提供了优化建议。该算法能高效解决最大匹配问题,在资源分配等场景中具有重要价值,是图论中的基础算法之一。(149字)

千淘万漉虽辛苦,吹尽狂沙始到金 2万+
上一篇: 图论最短路(模板/模板题)
下一篇: 线段树原理 and 例题
姐姐带你拿捏大厂算法
博客等级 码龄5年 17粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值