第二十二章 染色法与匈牙利算法

news2025/3/1 4:58:55

第二十二章 染色法与匈牙利算法

  • 一、使用场景——二分图
  • 二、染色法
    • 1、算法原理
    • 2、代码模板
      • (1)问题:
      • (2)代码:
      • (3)分析:
  • 三、匈牙利算法
    • 1、算法用途
    • 2、算法思路
    • 3、算法模板
      • (1)问题
      • (2)代码
      • (3)分析
        • st数组的解释:

一、使用场景——二分图

如下图所示,如果一个图中的点能够分成下图中的两个集合。集合中的点不相连,但是两个集合之间是由边连接的。那么这个图就是二分图。我们接下来介绍的染色法就是一种判断二分图的方法。
在这里插入图片描述

二、染色法

1、算法原理

我们将左侧集合中的点染成蓝色,右边中的点染成橙色。我们会发现二分图的形成条件就是,图中所有点,父节点和该节点的颜色不同,该节点和子节点的颜色也不同。

我们可以用反证法:假设该节点和父节点颜色相同,但也是二分图。

由于二者的颜色相同,所以必定在同一个集合中。又因为二者是父子关系,所以二者之间一定是连了一条边,这就导致集合中的点之间出现了边,这和二分图的定义是矛盾的。

所以假设不成立,故我们的定理正确,即:图中的所有点,父节点和该节点的颜色不同,该节点和子节点的颜色也不同的时候,这个图就是二分图。
在这里插入图片描述

2、代码模板

(1)问题:

在这里插入图片描述

(2)代码:

#include<iostream>
#include<cstring>
using namespace std;
const int N=1e5+10,M=2*N;
int h[N],e[M],ne[M],idx,color[N];
int n,m;
void add(int x,int y)
{
    e[idx]=y,ne[idx]=h[x],h[x]=idx++;
}
bool dfs(int u,int x)
{
    color[u]=x;
    for(int i=h[u];i!=-1;i=ne[i])
    {
        if(!color[e[i]])
        {
            if(!dfs(e[i],3-x))return false;
        }
        else if(color[e[i]]==color[u])return false;
    }
    return true;
}
int main()
{
    memset(h,-1,sizeof h);
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        int a,b;
        scanf("%d%d",&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;
                break;
            }
        }
    }
    if(flag)puts("Yes");
    else puts("No");
    return 0;
}

(3)分析:

在这里插入图片描述

我们这里解决一下主函数中为什么要去遍历一遍所有的点。其实这种做法就是为了避免非连通图的出现,例如下面的例子:
在这里插入图片描述
我们发现左侧的子图是二分图,但是右侧的子树不是二分图。而我们的dfs只能染色其中一个子图。因此,我们需要去遍历一遍所有的点,确定都是染了色的。

三、匈牙利算法

1、算法用途

我们先看下面这个图中的红色边:
在这里插入图片描述
我们发现任何一个顶点只有一条红色边指向另一边。这种图唯一吗?答案是不唯一的。还有可能是下面这种结果:
在这里插入图片描述
这也是一种连接方式。但是很明显第一种连接方式中红色边更多。那么这个红色边的数量是否存在一个最大值呢?我们接下来介绍的匈牙利算法就是解决这个问题的。

2、算法思路

这个算法的逻辑其实很简单,就是我们遍历左侧集合中的点A所对应的边W。如果边W对应的点B还没有红线连接,那么我就把A和B之间连上红线。如果边所对的右边集合中的点B已经被另外一个点C的红线连了。那么为了当前点A能够和点B之间搭上红线,我看看能不能让点C换一个,把B让给A。

其实就像,你追的人有对象了,那么我就看看能不能让你的情敌换一个对象,从而让你追到心上人。

3、算法模板

(1)问题

在这里插入图片描述

(2)代码

#include<iostream>
#include<cstring>
using namespace std;
const int N=1e5+10,M=2e5+10;
int h[N],e[M],ne[M],idx;
int match[N];
bool st[N];
int n1,n2,m;
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!=-1;i=ne[i])
    {
        int j=e[i];
        if(!st[j])
        {
            st[j]=true;
            if(match[j]==0||find(match[j]))
            {
                match[j]=x;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    memset(h,-1,sizeof h);
    cin>>n1>>n2>>m;
    for(int i=0;i<m;i++)
    {
        int a,b;
        scanf("%d%d",&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;
    return 0;
}

(3)分析

在这里插入图片描述

st数组的解释:

st数组的作用是去标记每个点去寻找对象的时候,他们所考虑的人选。比如我想找A作为对象,那么我就把它标记为true,如果A已经有对象了,那我们让A的对象再去找一个,但是再去找的时候,你就别再找A了。因为A已经是我要考虑的了。

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

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

相关文章

五个月学完软件测试,现在分享以前自学的测试笔记

以前学习手抄的linux命令哈哈哈 定义 在规定的条件下对程序进行操作&#xff0c;以发现程序错误&#xff0c;衡量软件质量&#xff0c;并对其是否能满足设计要求进行评估的过程。 测试就是发现错误而执行程序的过程。 原则 保证测试的覆盖度&#xff0c;但是穷举测试是不可能…

LVI-SAM坐标系外参分析与代码修改,以适配各种数据集

文章目录0.前言1.原作者传感器件坐标系定义与外参修改1.1.博客作者的讲解&#xff08;仅供参考&#xff09;1.2.LIO-SAM的README中作者对其传感器配置的解释1.3.IMU坐标系详解1.4.params_lidar.yaml中LIO外参修改1.4.1.作者给的参数注释问题1.4.2.自己修改代码2.LVI-SAM中的坐标…

Redis常见面试题(一)

目录 1、Redis是什么? 2、Redis有哪些应用场景? 3、Redis有什么优势? 4、Redis为什么这么快? 5、Redis主要消耗什么物理资源? 6、Redis为什么把所有数据放到内存中? 7、Redis命令是原子性的吗? 8、Redis磁盘快照操作是原子的吗? 9、Redis怎么测试连通性? 10、…

【图像去噪】均值+中值+空间+高斯滤波图像去噪【含GUI Matlab源码 763期】

⛄一、图像去噪及滤波简介 1 图像去噪 1.1 图像噪声定义 噪声是干扰图像视觉效果的重要因素&#xff0c;图像去噪是指减少图像中噪声的过程。噪声分类有三种&#xff1a;加性噪声&#xff0c;乘性噪声和量化噪声。我们用f(x,y&#xff09;表示图像&#xff0c;g(x,y&#xff0…

四十六——

四十六、JavaScript——对象 一、对象 数据类型&#xff1a;原始值&#xff1a; 1. 数值 Number 2. 大整数 BigInt 3. 字符串 String 4. 布尔值 Boolean 5. 空值 Null 6. 未定义 Undefinded 7. 符号 Symbol 除了七种原始值之外&#xff0c;后面所用到的数据类型&#xff0c;都…

jsp+ssm计算机毕业设计茶园文化交流平台论文【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

jsp+ssm计算机毕业设计超市收银系统论文【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

【LeetCode101. 对称二叉树】—— 二叉树遍历

101. 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a; …

【探索Spring底层】12.谈谈代理创建器与代理创建时机

文章目录1. 前言2. 谈谈代理创建器3. 代理创建时机是什么时候4. 浅谈Order的失效场景4. 浅谈Order的失效场景5. 高级切面如何转为低级切面1. 前言 Spring中有两种切面&#xff0c;一种是Aspect&#xff0c;另一种是Advisor 其中Aspect是高级切面&#xff0c;Advisor是低级切面…

【网站架构】网站系统怎么才是安全的?安全验收?等保、网络安全、SQL盲注、https、鉴权

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们讨论网站系统的安全性。 安全的重要性不言而喻&#xff0c;大部分安全问题确实是安全扫描后根据指引修改就可以了。 但是仍有一些问题修改起来是特别麻烦的&#xff0c;这些问题会严重影响上线时间。 本期我们的重点不…

共享购模式简单又好玩,撑起市场的半边天,推动实体产业改造上级

在2022年1月18日&#xff0c;国家发展改革委等七部局下发《促进消费实施方案》的通知&#xff0c;确立了”消费送积分”的新形式。该政策的出台&#xff0c;表明了政府探索实施全国绿色消费积分制度&#xff0c;鼓励地方结合实际建立本地绿色消费积分制度&#xff0c;以兑换商品…

S3 Drive支持以及FIPS 140-2兼容性

S3 Drive支持以及FIPS 140-2兼容性 在Windows Arm64上运行-添加了在Microsoft Windows for Arm64上的功能。无需额外下载&#xff0c;安装程序将为您的系统选择正确的驱动程序和库。 现在符合FIPS 140-2。 现在&#xff0c;您可以使用新的CacheOnlyFiles设置阻止上载临时(或其他…

基于高分辨率时频分析的单通道地震数据自动噪声衰减方法(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 记录的地震信号常常被噪声破坏。本文使用了一种基于高分辨率时频分析的单通道地震数据自动噪声衰减方法。同步压缩是一种时频重…

MySQL——保证主从一致

binlog 可以用来归档&#xff0c;也可以用来做主备同步&#xff0c;备库执行了 binlog 就可以跟主库保持一致。 MySQL 主备的基本原理 如图 1 所示就是基本的主备切换流程。 在状态 1 中&#xff0c;客户端的读写都直接访问节点 A&#xff0c;而节点 B 是 A 的备库&#xff…

Java安全--CC4

CC4 环境提一小嘴&#xff1a; CC4利用的是commons-collections4&#xff0c;所以我们需要导入新的依赖&#xff0c;地址&#xff1a;https://mvnrepository.com/artifact/org.apache.commons/commons-collections4/4.0 我们先来关注一下利用链&#xff1a; 后半段是一样的&am…

本地运行好好的 Java 程序, 一发布到线上就报错的灵异事件终于让我碰到了

说明 本文涉及的相关软件版本如下&#xff1a; mybatis 3.4.xHotSpot JDK1.8Windows 11IDEA 2022.3 先看一段 mybatis 相关的代码 今天一个朋友丢给我如下一段代码&#xff1a; 然后跟我讲为什么本地是好好的&#xff0c; 发布到线上执行就报错。 BlogMapper.java public…

【python机器学习】K-Means算法详解及给坐标点聚类实战(附源码和数据集 超详细)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 人们在面对大量未知事物时&#xff0c;往往会采取分而治之的策略&#xff0c;即先将事物按照相似性分成多个组&#xff0c;然后按组对事物进行处理。机器学习里的聚类就是用来完成对事物进行分组的任务 一、样本处理 聚类…

技术原理|Hologres Binlog技术原理揭秘

作者&#xff1a;张高迪&#xff08;花名杳天&#xff09;&#xff0c;Hologres研发。 同传统MySQL数据库&#xff0c;Hologres支持Hologres binlog&#xff0c;记录数据库中所有数据的变化事件日志。通过Hologres binlog&#xff0c;可以非常方便灵活的实现数据之间的复制、同…

“电池黑马”瑞浦兰钧增速惊人,动储双起飞

撰稿 | 多客 来源 | 贝多财经 12月14日&#xff0c;“电池黑马”瑞浦兰钧能源股份有限公司&#xff08;以下简称“瑞浦兰钧”&#xff09;向港交所主板提交上市申请&#xff0c;摩根士丹利和中信证券为其联席保荐人。至此&#xff0c;国内动力电池装机量排名前十的企业均已上…

DB Optimizer Multiplatform SQL评测和调优IDE

DB Optimizer Multiplatform SQL评测和调优IDE 增加了对最新版本Log4j的支持。 改进了分析会话功能&#xff0c;可提前提醒用户可能有问题的SQL。 DB Optimizer可以快速发现、诊断和优化性能较差的SQL。DBOptimizer使DBA和开发人员能够在整个开发生命周期中优化SQL性能&#xf…