二分图总结

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

二分图是什么?

二分图 是指将所有点分成两个集合, 使得所有边只出现在集合之间, 那就是二分图

二分图的性质:

  1. 二分图一定能进行无矛盾的染色
  2. 二分图一定不含有奇数环
  3. 二分图不一定是连通图

二分图的判定问题, 一般常用的方法是染色法判定二分图, 相邻的两个点用不同的颜色染色, 只要某个点染色不成功就说明整个图不是二分图, 染色不成功等价于相邻的点染了相同的颜色

#include<bits/stdc++.h>

using namespace std;

const int N = 3e5 + 10;

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

void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
bool dfs(int u, int c)
{
    color[u] = c;  //染色
    
    for(int i = h[u]; ~i; i = ne[i])
    {
        int j = e[i];
        if(!color[j])  //未被染色
        {
            if(!dfs(j, 3 - c)) return false;  //染色失败
        }
        else if(color[j] == c) return false; //染色失败
    }
    return true; //染色成功
}

int main()
{
    cin >> n >> m;
    
    memset(h, -1, sizeof h);  //初始化头结点
    
    for(int i = 1; i <= m; i ++ )
    {
        int a, b;
        cin >> a >> b;
        add(a, b), add(b, a);  //建图
    }
    
    for(int i = 1; i <= n; i ++ )  //给每一个点染色
    if(!color[i])
    {
        if(!dfs(i, 1))
        {
            cout << "No\n";
            return 0;
        }
    }
    cout << "Yes\n";
}

二分图的最大匹配

一些必要的概念

匹配:在图论中,一个「匹配」是一个边的集合,其中任意两条边都没有公共顶点。
最大匹配:一个图所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配。
完美匹配:如果一个图的某个匹配中,所有的顶点都是匹配点,那么它就是一个完美匹配。
交替路:从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边…形成的路径叫交替路。
增广路:从一个未匹配点出发,走交替路,如果途径另一个未匹配点(出发的点不算),则这条交替路称为增广路。

然后匈牙利算法的证明可以看这个博主, 讲的非常生动形象

证明

总结一下: 首先每个左节点预定右节点, 看右节点是否已经匹配, 如果已经匹配了,看他匹配的对象能不能匹配别人

#include<bits/stdc++.h>

using namespace std;

const int N = 1e5 + 10;

int e[N], ne[N], h[N], idx, match[N], n1, n2, m;
bool st[N];


void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}

bool find(int x)
{
    for(int i = h[x]; ~i; i = ne[i])
    {
        int j = e[i];
        if(!st[j])
        {
            st[j] = true;  //预定
            if(!match[j] || find(match[j])) // 1.是否已经匹配 2.看能不能再匹配别人
            {
                match[j] = x;  //匹配成功
                return true;
            }
        }
    }
    return false;
}


int main()
{
    cin >> n1 >> n2 >> m;
    
    memset(h, -1, sizeof h); //初始化头节点
    
    for(int i = 1; i <= m; i ++ )   //建图
    {
        int a, b;
        cin >> a >> b;
        add(a, b);
    }
    
    int res = 0;
    
    for(int i = 1; i <= n1; i ++ )   //每一组匹配
    {
        memset(st, false, sizeof st);  //因为每轮预定情况不同,所以需要初始化
        if(find(i)) res ++;
    }
    
    cout << res << '\n';
}

常用结论

二分图不存在奇数环    ⟺    \iff ⟺ 染色法不存在矛盾(证明略)
最大匹配数 = 最小点覆盖 = 总点数 - 最大独立集 = 总点数 - 最小路径覆盖
一个匹配是最大匹配    ⟺    \iff ⟺ 不存在增广路径

最小点覆盖问题:
定义: 给我们一个图, 从中选出最少的点, 使得图中的每一条边至少有一个顶点被选

在二分图中 最小点覆盖 == 最大匹配数

最大独立集问题
定义: 给我们一个图, 从中选出最多的点, 使得选出的点之间没有边

在二分图中 最大独立集 == 总点数 - 最小点覆盖 == 总点数 - 最大匹配数

最小不相交路径覆盖问题
定义: 在有向无环图中, 用最少的互不相交的路径, 将所有点覆盖

在二分图中 最小不相交路径覆盖 == n - 最大匹配数

最小路径重复点覆盖
定义: 在有向无环图中, 用最少的路径,将所有点覆盖

在二分图中, 我们先将原图做一遍传递闭包, 然后再进行二分图的最大匹配再与总点数作差就可以得到答案

最大匹配数 = 最小点覆盖 = 总点数 - 最大独立集 = 总点数 - 最小路径覆盖

二分图 文章目录二分图**一. 二分图的判断二.二分图的最大匹配三. 二分图最小点覆盖和最大独立集四. 二分图的最大权匹配 二分图** 二分图又称作二部图, 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。通俗来讲,就是二分图中的每一条边的两个顶点,... 阅读详情

相关推荐

二分图的一些概念

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

tanzhangwen的专栏 3307

【算法竞赛学习笔记】超有用的二分图详解!!!

title : 二分图 date : 2021-8-19 tags : ACM,图论 author : Linno 基础概念 二分图:又称为二部图,如果一个图G=(V,E)的顶点可以分为两个部分,对所有边,其两端点都处于不同的部分,那么这个图就是二分图。 若对于图G=(V,E),存在V的一个划分(A,B),使∀(u,v)∈E,都有u∈A,v∈B或者u∈B,v∈A,则称图G为二分图 若对于图G=(V,E),存在V的一个划分(A,B),使\forall(u,v)\in E,\\ 都有u\in A,v\in .

SC_Linno的博客 912

二分图匹配算法总结

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

skyline 5020

图神经网络(二):知识点整理

图神经网络知识点梳理

u013010473的博客 2113

大数据架构中的数据血缘追踪技术解析

数据血缘(Data Lineage)是指数据从源头到目标的完整流转路径,它记录了数据在整个生命周期中的变化过程。在大数据架构中,数据血缘追踪技术已经成为数据治理的核心组成部分。本文旨在全面解析数据血缘追踪的技术原理、实现方法和应用实践,帮助读者深入理解这一关键技术。本文将从基础概念入手,逐步深入到技术实现细节,最后探讨实际应用和未来趋势。数据血缘的核心概念和技术原理数据血缘的数学模型和算法实现实际项目案例和代码解析主流工具和解决方案比较未来发展方向和技术挑战。

架构师的AI之路,分享AI应用开发架构的学习与实践。 688

labview汽车电子通用测试程序架构,CAN通讯上位机

结合做过的汽车电子测试项目,车身控制器测试,CAN网络模块测试,电机控制器功能测试,汽车仪表盘视觉及功能测试、电气盒功能测试、EOL下线检测、车用空调控制器功能测试等项目,结合实际项目,整理编写的一个汽车电子,通用测试架构,包含项目的讲解等。6、数据保存 、数据处理、 曲线显示 、报警处理等。7、CAN总线故障信息监控及记录保存。2、参数设置(CAN端口及参数)5、CAN通讯+数据解析。

ali2805486883的博客 2753

二分图为什么不能存在奇数环

1.什么是二分图 2.为什么不能存在奇数环 可见,通过环推一圈下来,第一个点是矛盾的,故二分图不能存在奇数环

jahup的博客 2160

Weaxor勒索病毒实战分析:从加密算法到防御策略(附检测工具清单)

本文对Weaxor勒索病毒进行了深度实战剖析,详细拆解了其采用ChaCha20与AES-CTR的混合加密算法、横向移动手法及数据回传行为。文章重点分析了其密钥生成机制的“漏洞修复”,并提供了从主机加固、网络监控到基于IOC威胁狩猎的立体化企业级防御策略与检测工具清单。

weixin_29233333的博客 262

离散数学·图的着色

k -着色色数k -色图χ(……)

qq_61786525的博客 3235

【FPGA】安路FPGA下载器驱动安装教程

#来自学渣的问候 最近正在参加19年的FPGA创新设计大赛,然后我们选择了安路(全名:上海安路信息科技有限公司)的 FPGA 开发板。安路算是国产FPGA中还不错的一家,和紫光一样,除了自主生产的FPGA,也开始拥有了自己的编译环境。 好了。言归正传,写这篇博客的原因是,前几天在安装 安路 的编译环境和下载器驱动的时候,出了点问题,弄得心烦意乱。所以打算解决之后写篇博客,避开这个神奇的问题。 首先...

Ninquelote的博客 2万+

Windows 10下Gpg4win 4.3.1安装与配置全攻略:从下载到邮件加密实战

本文详细介绍了在Windows 10系统下安装和配置Gpg4win 4.3.1的全过程,包括下载、验证、自定义安装以及密钥管理。特别重点讲解了如何通过Kleopatra证书管理器进行密钥创建和管理,以及在Outlook中实现邮件加密的实战操作,帮助用户全面提升数据安全防护能力。

weixin_29271263的博客 301

图论 —— 二分图 —— 匈牙利算法

【基本概念】 1.交替路 从一个未匹配点出发,依次经过 非匹配边、匹配边、非匹配边… 形成的路径 2.增广路 定义:设 M 为二分图 G 已匹配边的集合,若 P 是图 G 中一条连通两个未匹配点的路径(起点在 X/Y部,终点在 Y/X 部),且属 M 的边(匹配边)与不属 M 的边(非匹配边)在 P 上交替出现,则称 P 为相对 M 的一条增广路径。 由于增广路的第一条边是没有参与匹配...

Alex_McAvoy的博客 4402

R以及Rstudio超详细安装教程(包括安装过程中出现的问题)

R安装及Rstudio安装,以及安装中出现的问题

2301_76908257的博客 1万+

二分图算法

二分图基础知识 首先什么是二分图 顾名思义就是能分成两个部分的图 要注意的是,‘分’的是点并且这两个集合(这里我们称作X集合和Y集合)内部所有的点之间没有边相连,也就是说X集合中任何两点之间都不会有边相连, Y亦然   定理1:无向图G为二分图的一个充要条件是 1、G中至少包含两个顶点  2、G中所有的回路长度都必须是偶数   接下来是一些概念: 匹配:设G=&lt;V, E&gt...

Geek 1万+

【UML】第12篇 序列图(1/2)——基本概念和构成

序列图(Sequence Diagram)是一种用于显示对象之间交互的图形化表示。它描述了在特定场景下,对象之间按照时间顺序进行的消息传递和协作过程。在序列图中,对象被表示为带有垂直虚线的矩形,虚线表示对象的生命周期。对象之间的交互通过箭头表示的消息来表示,箭头从一个对象的生命线指向另一个对象的生命线,表示消息的发送和接收。

AI人人懂 3046

[ vulhub漏洞复现篇 ] ActiveMQ反序列化漏洞复现(CVE-2015-5254)

Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。......

qq_51577576的博客 4444

关于二分图

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

你数过天上的星星吗 2799

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

二分图学习笔记

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

weixin_42366947的博客 1313

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

二分图最大匹配

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

curry___的博客 2977

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

二分图原理及应用

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

马丘 4201

图论——二分图

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

m0_70897036的博客 954

【蓝桥杯】二分图

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

Hsianus的博客 1320

二分图、匈牙利算法

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

nameofcsdn的博客 1323
上一篇: Codefroces Round #779(div2)A~C
下一篇: Codeforces Round #747 (Div. 2)(A-C)
广西小蒟蒻
博客等级 码龄7年 1296粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

广西小蒟蒻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值