二分图

算法讲解:二分图匹配 二分图匹配,自然要先从定义入手,那么二分图是什么呢? 二分图: 二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。 简单的说,一个图被分成了两部分,相同的部分没有边,那这个图就是二分图,二 阅读详情

二分图

一、二分图定义
大概就是在一个图G(S,V)中,可以把点集S分成两个集合使同一个集合中的点之间没有边相连;
比如说这个:
在这里插入图片描述

这个很简单,不知道的可以自行查阅有关资料;
二、二分图的匹配
什么叫二分图的匹配呢?
把二分图的两个点集中有边相连的边”匹配在一起“就叫二分图的匹配;
比如说上图中我把1与2配对,3与4配对,5与6配对,这就是二分图的一组匹配;
而看到这里我们可以自然而然的引出一个问题——怎么可以让一个二分图在匹配之后配对的对数最多?
这就是二分图的最大匹配问题;
我们来看这样一个例子:
有n个男的,m个女的,每个男的有一些喜欢的女的(而且这个喜欢都是相互的),当然每个男的都只能和一个女的
修成正果~不要问我为什么,问你最多会有几对情侣?
这就是二分图最大匹配的最典型例子(当媒婆)。那么我们要怎么才能解决这个问题呢?
这时候我们就要用一种叫匈牙利算法的算法(当然可以用网络流),在学习这种算法之前我们要了解一个新的概念
——二分图的增广路;
什么叫增广路呢?
增广路径是指,由一个未匹配的顶点开始,经过若干个匹配顶点,最后到达对面集合的一个未匹配顶点的路径,即这
条路径将两个不同集合的两个未匹配顶点通过一系列匹配顶点相连;
我们把增广路上的每条边的状态取反(已匹配变成未匹配,未匹配变成已匹配)就会发现端点的两个未匹配点都变成
了匹配点,其他的点状态不变,于是就多了一对匹配;
匈牙利算法就是通过不断寻找增广路来实现最大匹配的;
模板如下:

#include<bits/stdc++.h>
using namespace std;
struct node
{
int v,next;
node(int a,int b)
{
v=a;
next=b;
}
node(){}
}ma[1000010];
int t=0,head[2010],n,m,e,k=0;
bool vis[2010],pi[2010],mem[2010];
void add(int a,int b)
{
ma[++k]=node(b,head[a]);
head[a]=k;
}
bool flag;
bool Hun(int x)
{
if(mem[x]==1) return 0;
vis[x]=1;
for(int i=head[x];~i;i=ma[i].next)
{
if(vis[ma[i].v]) continue;
else if(ma[i].v<=n&&!pi[ma[i].v]) continue;
else if(ma[i].v>n&&!pi[ma[i].v])
{
pi[ma[i].v]=1;
return 1;
}
else if(Hun(ma[i].v)) return 1;
}
mem[x]=1;
return 0;
}
int main()
{//freopen("testdata.in","r",stdin);
memset(head,-1,sizeof(head));
int ans=0;
cin>>n>>m>>e;
for(int i=1;i<=e;i++)
{//cout<<i<<endl;
int a,b;
cin>>a>>b;
if(a>n||b>m) continue;
b+=n;
add(a,b);
add(b,a);
}
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(Hun(i)) ans++,pi[i]=1;
}
cout<<ans;
}

我们就这么完美的解决了这个问题 不算长
那么问题又来了——如果一个男的可以和多个女的修成正果(反之亦然)的话,这垃圾算法不就废了吗?
No,no,no!你们太天真了,这其实可以用巧妙的一个方法破解掉——拆点;
比如一个男的可以**k个女的,你就只需要把他当成k个人就行了~~(他精神分裂,每一重人格嗯哼一个女的,嗯~)
那么问题又来了,如果边有权值的话怎么办?
哼哼,你们以为我大匈牙利算法就这样就会痿了?没错它就是痿了!
那我们应该怎么办呢?
这时候就要用到一个叫KM算法的垃圾算法了;
But,我们今天不讲了,哈哈,气不气;

二分图的一些概念 什么是二分图若图G的结点集V(G)可以分成两个非空子集 V1和V2,并且图G的任意边xy关联的两个结点 x、y分别属于这两个子集,则图G是二分图。所有的树都是二分图。从树中任取一个结点为树根,着上白色,然后将根的所有孩子着上黑色,将下一层再着白色,继续此过程直到所有结点都着色。用着色法或标记法可以检测一个给定的图是不是十分图。偶数个结点的圈是二分图,而奇数个结点的圈不是二分图。所以如果图中含有奇圈 阅读详情

相关推荐

二分图匹配算法总结

最近在学习二分图相关算法,以下内容是根据自己的理解,欢迎讨论。 什么是二分图:        二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。 二分图的最大匹配:        给定一个二

skyline 5020

二分图总结

二分图总结:Hungarian,KM,Hall 定理

x052xiao的博客 1718

[网络流] 二分图匹配

二分图匹配,本质上是最大流问题的一种特殊情况。指派问题 有N台计算机和K个任务,我们可以给每台计算机分配一个任务,每台计算机能够处理的任务种类各不相同,请求出最多能够处理的任务个数。这个问题可以像下面这样转化为图论模型来分析。我们可以像下面这样来定义无向二分图 G=(U⋃V,E)G = (U \bigcup V,E)。 U是代表计算机的顶点集合,V是代表任务的顶点集合,对于任意u∈U和v∈V

童凌的技术博客 4332

关于二分图

二分图,又称为二部图、偶图,是一种重要的图模型 二分图判定 下面给出二分图的定义: 给定无向图G = < V,E >,如果可以将结点集V划分成两个子集V1和V2,使得边集E中的任何一条边,一个结点在V1中,另一个在V2中 具备这样性质的图,称为二分图 其中V1和V2称为结点互补集 通常将二分图记为G = < V1,E,V2 > 如果V1 中的每个结点和V2 中的每个结点之间都有边,则称 G = < V1,E,V2 > 为完全二分图 根据二分图的定义,可以得到平凡图和零图都

你数过天上的星星吗 2799

AIDD机器学习深度学习药物发现与设计教程总结

AIDD(AI Drug Discovery & Design):是近年来非常火热的技术应用,且已经介入到新药设计到研发的大部分环节当中,为新药发现与开发带来了极大的助力。倾向于机器对数据库信息的自我学习,可以对数据进行提取和学习,一定程度上避免了化合物设计过程中的试错路径,同时还会带来很多全新的结构,为药物发现打破常规的结构壁垒。覆盖了机器学习和深度学习,能与新药研发相结合并实质性的应用到靶点预测、高通量筛选、药物设计、药物的ADMET性质预测等;且算力方面,由早期应用于药物发现领域的决策树、随机

wutianlin0723的博客 6815

从Protocol到硬件控制:揭秘高通UEFI中ABL与XBL的协作机制

本文深入解析了高通UEFI架构中ABL与XBL的协作机制,重点探讨了Protocol通信在硬件控制中的关键作用。通过对比传统GPIO控制方式,揭示了Protocol架构在安全性、可维护性和灵活性方面的优势,并提供了关机充电场景的实战案例分析及调试技巧。

weixin_29185199的博客 430

二分图学习笔记

使用题单:二分图 - 从入门到入土。对于一个图,如果能够把它的点集恰好分成两个部分,使得这第一个部分里面的点两两不连边,第二个部分里面的点也两两不连边,则该图是二分图。或者说每一条边都横跨了两个集合。举个例子:这个图是二分图,因为我们可以将它分成 {1,3,5,7}\{1,3,5,7\}{1,3,5,7} 和 {2,4,6}\{2,4,6\}{2,4,6} 两个点集:但是这个图:可以发现这个图无论如何也无法划分点集,所以这个图不是二分图。还是给一下不说人话的形式化定义:注意,二分图可以不是连通图。很容易想到

weixin_42366947的博客 1313

关于HC32F460 输出可调占空比PWM波遇到的问题记录

文章目录问题记录一、问题分析二、解决方法总结 问题记录 芯片:HC32F460系列 功能:PWM电机调速 最近产品开发,需要用到HC32的PWM输出来控制电机的转速。参考官方的例程很快就完成了相关的功能,但是,后面在测试,重复开关电机的时候,发现电机的转速时大时小。 一、问题分析 一开始,怀疑是相关寄存器的设置出错导致的问题。因此在设置PWM输出时加上LOG打印,上机测试并没有发现问题。 用示波器抓取波形,这是正常状态下的波形(上电默认配置成5kHz,70%占空比输出) 这是转速较小时的波形输出 .

Top0_0lll的博客 6165

二分图最大匹配

先上定义: 一、二分图 二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图 也就是一个图被划分成了两个不相交的集合,集合内部没有边相连。 二、匹配 1、匹配 在一个二分图G中,它的一个子集...

curry___的博客 2977

QWEN 2.5模型结构解析与代码解读

对Qwen2.5大模型的代码进行研究

4362

Windows报错“The system cannot find the file specified“的PATH环境变量解决方案

摘要: Windows系统中出现"The system cannot find the file specified"错误通常因PATH环境变量配置问题导致。本文提供解决方案:1)检查并修正PATH变量(通过命令行或图形界面添加缺失路径);2)确认程序安装路径及拼写无误;3)恢复误改的系统变量。示例演示了Python路径配置及无效路径清理方法,建议谨慎修改变量、使用绝对路径并定期检查。附参考表格详述操作步骤,帮助用户高效解决问题并优化系统环境。

shejizuopin的博客 3515

二分图原理及应用

二分图 什么是二分图? G=(V, E),其中G代表图,V代表这个图的所有顶点的集合,E代表这个图所有连线的集合,即是边集。现如今如果能将V这个顶点集分成两个互不相交的子集A、B,E这个边集内所有边的两个顶点分别属于*A、B两个子集的话,我们就称这个图为二分图。 要点 无向图 所有点分成A,B两个不相交的集合 所有边,都在着两个集合之间。 同一个集合不能有边。 二分图应用 如何检测二分图? 染色 二分图最大匹配?匈牙利算法 如何检测二分图? 染色法 如果我们能够把图中的所有顶点分成两部分,

马丘 4201

LLaMA Factory添加新模型template的实战解析

本文主要介绍了LLaMA Factory添加新模型template的实战解析,希望对使用大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 实战解析 2.1 检查代码 2.2 修改代码

herosunly的博客 19万+

图论——二分图

如果一张无向图的N个节点N≥2可以分成AB两个非空集合,其中A∩B∅,并且在同一集合内的点都没有边相连,那么成这张无向图为一张二分图。

m0_70897036的博客 954

tsfknn 预测R语言中的时间序列

rolling参数应该设置为FALSE,这使得最后的18个观测值成为测试集,其余的作为训练集;如果我们将rolling参数设置为默认值TRUE,那么测试集就不会是一个恒定的向量。lag 滞后参数表示时间序列数据的滞后值。在这个例子中,由于我们的时间序列数据是月度的,我们将参数设置为1:12。作为药品福利计划的一部分,澳大利亚健康保险委员会记录的属于ATC代码A10的产品的每月政府支出(百万美元)。我们将使用tsfknn包,它可以用来预测R语言中的时间序列。格式:ts类别的月度时间序列。

Mrrunsen的博客 323

Ardupilot二次开发(二):自定义mavlivk消息

在下面的文件添加自定义消息的xml定义然后编译固件,会生成相应的消息头文件。

超维空间科技的博客 2312

【蓝桥杯】二分图

二分图又称作。就是顶点集 V 可分割为两个互不相交的子集,且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。当图中的顶点分为两个集合,使得第一个集合中的所有顶点都与第二个集合中的所有顶点相连时,此时是一特殊的二分图,称为完全二分图。

Hsianus的博客 1320

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

二分图、匈牙利算法

完全二分图是一种特殊的二分图,可以把图中的顶点分成两个集合,使得第一个集合中的所有顶点都与第二个集合中的所有顶点相连。很显然,主要的效率问题就是,在唯一的while循环里面,有1个从1到n的循环,只为了检索一些特定的目标出来。题目大意就是把图分成二分图,如果不能的话,输出-1,如果能的话,分别输出2个部分的点的数量和点的标号。二分图是指,可以把图中的顶点分成两个集合,使得每个集合中的所有点之间都是互不相连的。表面上有3层循环,实际上外面的2层while循环是有限制的,合起来也就是大约n而已。

nameofcsdn的博客 1323

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

二分图详解

         本篇博客主要讲解什么是二分图,怎样判断二分图,匈牙利算法和HK(Hopcroft-Karp)算法,以及二分图多重匹配。 二分图定义:        二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B)...

Charles_Zaqdt的博客 1916

OV9734 DATASHEET,完整规格书

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

图论-二分图

此题也是一个二分图问题,n个人分为两组就是将n个点染色为两种,然后dislikes数组表示不能同色的人,其实在二分图中就是相连接的节点就是数组中的组合,因为相邻节点和dislike中组合都不能同色。你使用什么数据结构来存储这种关系呢?既然说到遍历图,也不涉及最短路径之类的,当然是 DFS 算法和 BFS 皆可了,DFS 算法相对更常用些,所以我们先来看看如何用 DFS 算法判定双色图。二分图的顶点集可分割为两个互不相交的子集,图中每条边依附的两个顶点都分属于这两个子集,且两个子集内的顶点不相邻。

qwertyasdfghh的博客 2231

Acwing 二分图

二分图,来匹配对象?

qq_43060884的博客 1022

二分图与二分图匹配

二分图匹配(附赠彩蛋)

Ricky2007的博客 535
上一篇: 题解-家谱
下一篇: 题解-01背包
Cancelleds
博客等级 码龄8年 1110粉丝 166原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值