【算法】二分图的相关性质

2023-05-16

二分图的定义

二分图是指将图中所有点分为两个集合,任意一条边对应的两个点都不在同一个集合中。

二分图的判定

判定一个图是否为二分图,是考虑这个图中是否有奇数环,如果不存在奇数环,则图为二分图。
具体的判定方法可以使用染色法。

vector<int> g[N]; // vector 存储图
const int N = 100010;
int color[N]; // 标记每个点的颜色,为 0 表示还未被染色

bool dfs(int u, int c) {
    color[u] = c;
    for (int v: g[u])
        if (color[v] == 0) {
            if (!dfs(v, 3 - u)) return false;
        } else if (color[v] != color[u]) {
            return false;
        }
    return true;
}

// 一边标记为颜色 1,一边标记为颜色 2

bool ans = true;
for (int i = 1; i <= n; ++i) 
    if (color[i] == 0) {
        if (!dfs(i, 1)) {
            ans = false;
            break;
        }
    }

if (ans) puts("This graph is biparite graph.");
else puts("This graph is not biparite graph.");

二分图判定模板题:860. 染色法判定二分图

二分图判定的练习题:257. 关押罪犯

二分图的最大边匹配

对于一个二分图,分为集合 S S S 和 集合 T T T

选择最多的边,使得这些边对应的点各不相同。

那么解决这个问题的就是匈牙利算法,这也是接下来解决问题的重点算法。

int match[N];
int st[N];
int g[N][N];

bool hungarian(int i) {
    for (int j = 1; j <= n; ++j) {
        if (g[i][j] && !st[j]) {
            st[j] = true;
            if (match[j] == 0 || hungarian(match[j])) {
                match[j] = i;
                return true;
            }
        }
    }
    return false;
}

int res = 0;
for (int i = 1; i <= n; ++i)
    if (hungarian(i)) res += 1;

printf("二分图的最大边匹配为:%d\n", res);

解释一下上面的几个数组:

  • g[i][j] 是邻接矩阵存储的图

  • match[j] 表示 T 中的点 j 匹配边的 S S S 中的点。

  • st[j] = true 表示第 j 个点已经被其他人考虑了,暂时不能考虑。

    一个例子:如果有边 1-41-52-4。对应的集合 S = {1, 2},集合 T = {4, 5}

    首先 S1T4 匹配,接着来考虑 S2 要匹配的点,S2 只能与 T4 匹配,所以考虑 T4 目前匹配的点 S1 是否可以匹配其他边。幸运的是 S1 可以匹配 T5 ,从而把 T4 让出来。

    但是我们需要考虑在算法的枚举过程中,如果 st[4] == false ,则在使得 T4 目前匹配的点 S1 考虑其他边时,从小到大,其总会先看到 T4 ,如此陷入一个死循环。

    • 一方面限制当前点更换匹配边对应的点不是我们当前选择的这个点

    • 另一方面是告诉其他想要拆这个点对应的匹配边的其他点,这里已经考虑过了。如果之前拆分成功,则会一路 return true 退出该函数;如果之前拆分不成功,你这次尝试也不会成功,就别妄想了。

二分图最大边匹配的识别:372. 棋盘覆盖

二分图的最小点覆盖

对于一个二分图,分为集合 S S S 和 集合 T T T

选择最少的点,使得其可以覆盖所有的边。(覆盖一条边是指,一条边对应两个点,其中至少有一个点被选择)

一个结论:二分图的最大边匹配 = 二分图的最小点覆盖数,懒得证明了。

二分图最小点覆盖的识别:376. 机器任务

二分图的最大独立集与最大团

对于一个图,分为集合 S S S 和 集合 T T T,选择最多的点,但是这些点中任意两个点都不存在一条边,这个点集就是最大独立集。

对于一个图,分为集合 S S S 和 集合 T T T,选择最多的点,使得任意两点之间都存在边,这些点和他们之间的边构成了一个完全图,这个完全图叫作团,选择最多的点满足这个条件,这些点和他们之间的边构成了一个最大团。

在二分图中有一些结论:二分图的最大独立集 = 点数 - 二分图的最小点覆盖。

简单证明下:二分图的最大独立集是指选择最多的点,两两点之间内部不存在边。等价于 “去掉最少的点,将所有边都破坏掉”,即选择最少的点,覆盖所有的边,对应的就是二分图的最小点覆盖。

二分图的最大独立集识别:378. 骑士放置

二分图的最小路径点覆盖和最小路径重复点覆盖

对于一个有向无环图(DAG) ,二分图的最小路径点覆盖是指找到最少的路径,选择的路径之间不存在交点,使得覆盖所有点。

一个结论:二分图的最小路径点覆盖 = 点数 - 二分图的最大边匹配

简单证明:

假设现在有 5 个点,我们建立如下的图,如果从 1 点有一条向 2 点的边,那么我们在下面这个图中从 1 点向 2’ 点连一条边。
对于一个路径来说,其只有一个终点,这个终点没有出边,即对于所有的出点来说,找到所有没有向入点连边的出点,这就是路径数。
故我们需要找到最少的出点,等价于我们需要找到尽可能多的出点都有匹配边,即找到最大边匹配,减去这些有匹配边的出点,剩余的没有匹配边的出点就是路径的终点。

1       1'
2       2'
3       3'
4       4'
5       5'
出点    入点

二分图的最小路径重复点覆盖,可以通过传递闭包,转换为二分图的最小路径点覆盖。
我们现在有路径 x->y->z,但是 x->yy>z 都已经被走过,那么对于这条路径,剩余价值为 x->z 没走过,将这条边加入到图中。
而传递闭包就是指:x->y & y->z ==> x->zx->y 以及 y->z 可以推导出 x->z

二分图的最小路径重复点覆盖、二分图的最小路径点覆盖识别

总结

  1. 二分图等价于:图中不存在奇数环,等价于染色法不会有矛盾
  2. 匈牙利算法求解二分图最大边匹配
  3. 二分图的最大边匹配 = 二分图的最小点覆盖 = 二分图总点数 - 二分图的最大独立集 = 点数 - 二分图的最小路径点覆盖
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【算法】二分图的相关性质 的相关文章

  • vs2019修改编码方式为UTF-8的方法

    原因 git上下载的项目编码有问题 xff0c 不识别中文或者编码不是utf 8 xff0c 之前其实也遇到过 xff0c 处理完了就忘记了 xff0c 又遇到这种糟心的事情了 xff0c 就顺手记录下 方法 检查系统的语言编码 设置 gt
  • windows 10上源码编译libjpeg-turbo和使用教程

    参考文献 Windows 配置libjpeg turbo并在python中调用 windows 10上源码编译libjpeg turbo和使用教程 compile and use libjpeg turbo on windows 10 环境
  • Pycharm及VScode 安装Copilot 踩坑

    首先在官网申请copilot使用权限 xff0c 经过一段时间等待 xff0c 就会给你授权 接下来就是针对本地的IDE集成插件对于VSCode xff0c 直接按照官网教学 xff08 VScode插件安装 xff09 即可 xff0c
  • gitlab基本配置和使用

    目录 一 gitlab的SSH配置1 下载安装git2 生成SSH keys 二 fork自己的库1 进入原库2 项目管理3 把自己fork的库clone到本地 三 如何更新自己的fork库1 先对我们现在的fork库内的文件进行修改2 进
  • 如何把word文档保存为.md文件

    第一种 插件 插件安装 一直next 安装后不用运行 打开想要转换的word文档 xff0c 选择 34 另存为 34 安装成功后 xff0c 保存格式中会自动出现md后缀格式的选项 选择 md格式 xff0c 保存即可 第二种 在线转换
  • VirtualBox安装Arch Linux2019并迁移物理机

    VirtualBox安装Arch Linux2019并迁移物理机 安装Arch Linux下载版本使用VirtualBox安装安装grub设置网络和ssh 迁移到物理机1 正常识别U盘2 拷贝U盘3 启动物理机4 更新虚拟内存盘 安装Arc
  • P4180 [BJWC2010]严格次小生成树(kruskal + 倍增 + lca)

    思路 xff1a xff08 1 xff09 先求最小生成树 xff0c 重新建图 xff08 2 xff09 遍历所有非树边 xff0c 用树上倍增求LCA的方法求出非树边两节点之间树边中的最大边和次大边 xff0c 再将非树边权值与最大
  • JUnit测试控制台输出和System.exit(0)

    JUnit测试中可以用assertTrue xff0c assertEquals等断言对代码进行简单的测试 xff1a 如返回的布尔类型是否为真 xff0c 所得的数据结果是否与预想的一样 xff0c 有时程序可能会为健壮性做一些向控制台输
  • vsphere client克隆虚拟机后配置(DNS解析+MAC地址+UUID+ip+主机名)

    1 克隆模板机 在想要克隆的虚机上右键点击克隆 xff0c 一直下一步 参考 xff1a https www jianshu com p ebba00a0e503 2 修改配置 2 1修改主机名 临时修改主机名 span class tok
  • vue3 computed计算属性

    lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt meta http equiv 61 34 X U
  • 使用VNC远程连接centos桌面的最简便方法

    第一步 在centos上安装VNC server 这里我们安装tigervnc xff0c 也可以安装其他vnc服务器 xff0c 例如realvnc tightvnc ultravnc等 xff0c 但是realvnc要收费 xff0c
  • Django(73)django-debug-toolbar调试工具

    介绍 Django框架的调试工具栏使用django debug toolbar库 xff0c 是一组可配置的面板 xff0c 显示有关当前请求 响应的各种调试信息 xff0c 点击时 xff0c 显示有关面板内容的更多详细信息 应用 1 安
  • mac环境下 解决“Conda command not found”

    在终端中输入 xff1a conda version gt 查看安装的conda版本 此时 xff0c 出现Conda command not found xff0c 说明需要配置环境变量 xff0c 具体操作如下 xff1a vim ba
  • 风控模型算法

    目录 1 蚂蚁金服2 陆金所3 京东金融4 苏宁金融5 百度金融6 腾讯理财通7 宜信8 钱大掌柜9 万达金融10 网易理财11 美团金融 主要是整理目前市面上的风控模型以及风控算法 xff08 不间断更新中 xff09 1 蚂蚁金服 xf
  • 两个List对象,指定属性,取差集、交集。

    文章目录 差集交集过滤实体类测试类打印效果 差集 span class token comment 差集 list1 list2 61 list1 中不同数据 span span class token class name List sp
  • linux 目录说明

    项目价格 bin存放二进制可执行文件 ls cat mkdir等 xff0c 常用命令一般都在这里 etc存放系统管理和配置文件 home存放所有用户文件的根目录 xff0c 是用户主目录的基点 xff0c 比如用户user的主目录就是 u
  • 辗转相除法的原理

    辗转相除法是求最大公约数的一种方法 它的具体做法是 xff1a 用较小数除较大数 xff0c 再用出现的余数 xff08 第一余数 xff09 去除除数 xff0c 再用出现的余数 xff08 第二余数 xff09 去除第一余数 xff0c
  • P2078 朋友--并查集--接上章--sabrindol--Sabrina

    P2078 朋友 并查集模板题 传送门 题目背景 小明在A公司工作 xff0c 小红在B公司工作 题目描述 这两个公司的员工有一个特点 xff1a 一个公司的员工都是同性 A公司有N名员工 xff0c 其中有P对朋友关系 B公司有M名员工
  • Springboot整合myBatis(附加pagehelper分页插件)

    Springboot整合myBatis xff08 附加pagehelper分页插件 xff09 前提第一步 xff0c 创建spring boot xff0c 导入maven依赖第二步 xff0c 进行appliction配置第三步 xf

随机推荐

  • 【linux免费安装ssl证书,自动续费,享受https】

    为了在 CentOS 上为您的域名安装免费的 SSL 证书并启用 HTTPS xff0c 您可以使用 Let s Encrypt 提供的免费证书 下面是使用 Certbot 工具在 CentOS 系统上为您的域名安装和配置 Let s En
  • VS2017修改代码编码格式为utf-8

    VS2017修改代码编码格式为utf 8 对于国内用户来说 xff0c 大多设置Windows操作系统语言为简体中文 编码为GBK或GB2312 xff0c 由此导致Visual Studio2017默认采用GBK GB2312编码格式 x
  • 【c++】string字符串拼接的三种方式

    span class token macro property span class token directive keyword include span span class token string lt iostream gt s
  • 【单调栈】最大矩形

    问题描述 给一个直方图 xff0c 求直方图中的最大矩形的面积 例如 xff0c 下面这个图片中直方图的高度从左到右分别是2 1 4 5 1 3 3 他们的宽都是1 xff0c 其中最大的矩形是阴影部分 Input amp Output I
  • 1002 A+B for Polynomials

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp
  • Vision-based Vehicle Speed Estimation: A Survey

    该文是对 Vision based Vehicle Speed Estimation A Survey 的翻译 xff0c 为了个人记录学习 目录 摘要1 引言2 概念与术语2 1 输入数据2 2 检测与追踪2 3 距离和速度估计2 4 应
  • 【洛谷训练】阶乘数码

    题目链接 xff1a 阶乘数码 对于这道题 xff0c 一开始我没有理解题目的意思 xff0c 后来看了题解才明白是求5 xff01 61 120的结果中含有几个2 明白题意后 xff0c 想到了要结合之前做过的一道题 xff0c 阶乘之和
  • JAVA调用天气获取接口

    JAVA调用天气获取接口 xff08 百度天气API 高德天气API xff09 解决方法可以看第四部分一 需求 xff1a 在Java项目中需要获取天气情况 xff1b 二 开发环境 xff1a idea三 试错与学习1 1 百度天气AP
  • 洛谷 P1002 过河卒

    题目描述 棋盘上 A 点有一个过河卒 xff0c 需要走到目标 B 点 卒行走的规则 xff1a 可以向下 或者向右 同时在棋盘上 C 点有一个对方的马 xff0c 该马所在的点和所有跳跃一步可达的点称为对方马的控制点 因此称之为 马拦过河
  • SQL查询数据

    1 创建新的用户并授权 xff1a span class token keyword create span span class token keyword user span cc identified span class token
  • Windows10下Linux子系统Ubuntu使用教程——安装图形界面

    一 准备 在Ubuntu中执行以下操作 xff1a 1 安装xorg sudo apt span class token operator span get install xorg 2 安装xfce4 sudo apt span clas
  • SpringBoot整合Mybatis-plus代码生成器(代码直接可用)

    前言 在做SpringBoot项目时 因为要对数据库中各表进行增删改查操作 xff0c 而表的数量又相对较多 xff0c 故而需要进行较多的controller xff0c mapper xff0c service以及实体类的创建 xff0
  • 无向图添加最少边使得图边双连通

    题意 xff1a 给定一个无向连通图 xff0c 问最少要添加多少条边 xff0c 可以使得这个图是边双连通的 题解 xff1a t a r j a n
  • 关于浏览器打开时自动打开部分网页(浏览器被劫持)的解决办法

    1 右击浏览器的快捷方式 xff0c 点击属性 xff0c 默认是显示快捷方式 2 会发现目标一栏下有一个多出来的URL 3 删除后点击确认 xff0c 会发现没什么效果 4 再次右击浏览器的快捷方式 xff0c 点击属性 xff0c 再点
  • 【深入理解计算机系统】第三章重点汇总

    3 1 程序的机器级表示 现有两个源文件 xff1a main span class token punctuation span c span class token macro property span class token dir
  • macbook m1芯片 实现vscode下debug(解决无法读入的问题)

    需要下载的 点击下载vscode xff0c 注意选择Mac的Universal版本 xff08 兼容intel和apple silicon xff09 安装两个插件 C C 43 43 Extension Pack CodeLLDB 需要
  • Ubuntu利用anaconda安装TensorFlow-gpu版本以及安装paddle-gpu版本

    在Ubuntu系统安装GPU版本的TensorFlow xff0c 主要就是要选择好合适的TensorFlow版本以及与之相对应的cuda以及cudnn版本 第一步 xff0c 确保系统安装了anaconda xff0c 这个安装过程较为简
  • 【笔试】备战秋招,每日一题|20230415携程研发岗笔试

    前言 最近碰到一个专门制作大厂真题模拟题的网站 codefun2000 xff0c 最近一直在上面刷题 今天来进行2023 04 15携程研发岗笔试 xff0c 整理了一下自己的思路和代码 比赛地址 A 找到you 题意 xff1a 给定一
  • 【算法】欧拉路径的DFS存储顺序

    欧拉路径和欧拉回路 对于无向图 xff0c 所有边都是连通的 xff08 1 xff09 存在欧拉路径的充分必要条件 xff1a 度数为奇数的点只能有0个或2个 xff08 2 xff09 存在欧拉回路的充分必要条件 xff1a 度数为奇数
  • 【算法】二分图的相关性质

    二分图的定义 二分图是指将图中所有点分为两个集合 xff0c 任意一条边对应的两个点都不在同一个集合中 二分图的判定 判定一个图是否为二分图 xff0c 是考虑这个图中是否有奇数环 xff0c 如果不存在奇数环 xff0c 则图为二分图 具