当前位置: 首页 > news >正文

【算法基础:搜索与图论】3.6 二分图(染色法判定二分图匈牙利算法)

文章目录

  • 二分图介绍
  • 染色法判定二分图
    • 例题:860. 染色法判定二分图
  • 匈牙利匹配
    • 二分图最大匹配
    • 匈牙利匹配算法思想
    • 例题:861. 二分图的最大匹配

二分图介绍

https://oi-wiki.org/graph/bi-graph/

二分图是图论中的一个概念,它的所有节点可以被分为两个独立的集合,每个边的两个端点分别来自这两个不同的集合
换句话说,二分图中不存在连接同一集合内两个节点的边

在这里插入图片描述

在这里插入图片描述

染色法判定二分图

如何判断一个图是二分图?
当且仅当图中不含奇数环。(奇数环指的是环中边的个数是奇数)(因为每一条边都是从一个集合走到另一个集合,只有走偶数次才有可能回到同一个集合。)


染色:相邻的节点的颜色不一样。
在这里插入图片描述
因为没有奇数环,所以染色过程是一定不会发生矛盾的。

时间复杂度是 O ( n + m ) O(n + m) O(n+m) , n 表示点数,m 表示边数。

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

https://www.acwing.com/activity/content/problem/content/926/

在这里插入图片描述

使用 dfs 对图中各个节点染色,染色过程中不发生冲突即为二分图。

import java.util.*;public class Main {static final int N = 100005;static List<Integer>[] g = new ArrayList[N];static int[] color = new int[N];public static void main(String[] args){Scanner sc = new Scanner(System.in);int n = sc.nextInt(), m = sc.nextInt();// 建图Arrays.setAll(g, e -> new ArrayList<Integer>());for (int i = 0; i < m; ++i) {int u = sc.nextInt(), v = sc.nextInt();g[u].add(v);g[v].add(u);}// 图可能由多个非连通的子图构成。因此,应该对每一个尚未访问过的点都进行一次深度优先搜索。boolean f = true;for (int i = 1; i <= n; ++i) {if (color[i] == 0 && !dfs(i, 1)) {f = false;break;}}System.out.println(f? "Yes": "No");}static boolean dfs(int x, int c) {boolean res = true;color[x] = c;for (int y: g[x]) {if (color[y] == 0) res &= dfs(y, 3 - c);else if (color[y] == color[x]) return false;}return res;}
}

匈牙利匹配

二分图最大匹配

**二分图最大匹配**
翻译成人话就是——
给定一个二分图 G,即分左右两部分,各部分之间的点没有边连接,要求选出一些边,使得这些边没有公共顶点,且边的数量最大

匈牙利匹配算法思想

两个集合的点数分别是 n1 , n2。
枚举 n1 , 尝试 i 是否可以找到一个 j 完成匹配,匹配成功就 ++cnt。

所以重点是 find(i) 方法:
对每个 i ,枚举 i 相邻的所有 j —— 如果 j 没有被匹配就直接返回 true;如果 j 被匹配了,就尝试现在和 j 匹配的另一个 i 能不能换一个 j,能换就换一个然后返回 true;否则返回 false。

时间复杂度是 O ( n ∗ m ) O(n * m) O(nm),n 表示点数,m 表示边数。

例题:861. 二分图的最大匹配

https://www.acwing.com/activity/content/problem/content/927/
在这里插入图片描述

重点是理解数组 matchst 的含义,以及方法 find(x) 的写法和使用。

import java.util.*;public class Main {static final int N = 505;static int[][] g = new int[N][N];static int[] match = new int[N];		// match记录集合2中各个点匹配的集合1的点是哪个static boolean[] st = new boolean[N];	// st表示集合2中的点有没有被匹配static int n1, n2;public static void main(String[] args){Scanner sc = new Scanner(System.in);n1 = sc.nextInt();n2 = sc.nextInt();int m = sc.nextInt();// 建图for (int i = 0; i < m; ++i) {int u = sc.nextInt(), v = sc.nextInt();g[u][v] = 1;        // 左边的 u 和 右边的 v 之间有一条边}int cnt = 0;for (int i = 1; i <= n1; ++i) {Arrays.fill(st, false);		// 重置stif (find(i)) ++cnt;}System.out.println(cnt);}static boolean find(int x) {for (int j = 1; j <= n2; ++j) {if (!st[j] && g[x][j] == 1) {st[j] = true;// 如果 j 还没有匹配或者当前使用 j 的 x 可以让出去if (match[j] == 0 || find(match[j])) {match[j] = x;return true;}}}return false;}
}

相关文章:

【算法基础:搜索与图论】3.6 二分图(染色法判定二分图匈牙利算法)

文章目录 二分图介绍染色法判定二分图例题&#xff1a;860. 染色法判定二分图 匈牙利匹配二分图最大匹配匈牙利匹配算法思想例题&#xff1a;861. 二分图的最大匹配 二分图介绍 https://oi-wiki.org/graph/bi-graph/ 二分图是图论中的一个概念&#xff0c;它的所有节点可以被…...

SpringMVC 怎么和 AJAX 相互调用的

通过 Jackson 框架就可以把 Java 里面的对象直接转化成 Js 可以识别的 Json 对象。 步骤如下 &#xff1a; a、加入 Jackson.jar b、在配置文件中配置 json 的映射 c、在接受 Ajax 方法里面可以直接返回 Object,List 等,但方法前面要加上ResponseBody 详细步骤&#xff1a; …...

UCDOS和WPS推动计算机领域的汉字化发展,中文编程该谁力扛大旗?

你还记得UCDOS吗&#xff1f; 从DOS时代过来的人&#xff0c;还知道UCDOS的&#xff0c;现在可能已经是中年人了&#xff01; 当时&#xff0c;鲍岳桥的UCDOS可以称得上是中国的国产操作系统。 在Windows还没来得及进入中国市场时&#xff0c;UCDOS可以说是走向了巅峰时刻&a…...

golang+layui提升界面美化度--[推荐]

一、背景 golanglayui提升界面美化度--[推荐]&#xff1b; golang后端写的页面很难看&#xff0c;如何好看点呢&#xff0c;那就是layui https://layui.dev/ 也是一个简单上手容易使用的框架&#xff0c;类似jquery&#xff0c;对于后端开发来说满足使用需求 二、使用注意点…...

42. 接雨水

题目介绍 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3…...

Python学习阶段路线和内容

Python学习阶段路线和内容 这是我的看法和认识&#xff0c;供参考。 Python学习路线主要分为三个阶段&#xff1a;入门阶段、提高阶段和深入阶段。 入门阶段 入门阶段需要学习Python的基本语法&#xff0c;掌握变量和数据类型、条件语句和循环语句、函数和模块等内容。并通过…...

RocketMQ教程-安装和配置

Linux系统安装配置 64位操作系统&#xff0c;推荐 Linux/Unix/macOS 64位 JDK 1.8 Maven3.0 yum 安装jdk8 yum 安装maven 1.下载安装Apache RocketMQ RocketMQ 的安装包分为两种&#xff0c;二进制包和源码包。 点击这里 下载 Apache RocketMQ 5.1.3的源码包。你也可以从这…...

【LeetCode】55.跳跃游戏

题目 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1&#xff1a; 输入&#xff1a;nums [2,3,1,1,4] 输出&#xff1a;true 解释&#xff1a;可以…...

Docker学习路线12:开发者体验

到目前为止&#xff0c;我们只讨论了使用Docker来部署应用程序。然而&#xff0c;Docker也是一个极好的用于开发应用程序的工具。可以采用一些不同的建议来改善开发体验。 在应用程序中使用docker-compose以方便开发。使用绑定挂载将本地代码挂载到容器文件系统中&#xff0c;…...

后端服务迁移方案及过程记录

阶段时序动作双写数据对比1新rdb集群上线双写数据对比2新服务上线&#xff0c;无流量双写数据对比2后端自己发起的流程比如job&#xff0c;新服务上线一份新的&#xff0c;独立运行双写数据对比2消费二方mq&#xff0c;新服务使用新的消费组消费原有消息双写数据对比3新旧服务比…...

StAX解析

StAX解析 StAX解析介绍 StAX解析与SAX解析类似&#xff0c;也是基于事件驱动的&#xff0c;不同之处在于StAX采用的是拉模式&#xff0c;应用程序通过调用解析器推进解析的进程&#xff0c;可以调用next()方法来获取下一个解析事件(开始文档&#xff0c;结束文档&#xff0c;开…...

[MCU]AUTOSAR COM STACK - CAN协议栈

各层PDU PDU&#xff1a;Protocal Data Unit&#xff0c;协议数据单元&#xff0c;由SDU和PCI组成&#xff1b; I-PDU&#xff1a;Interaction Layer PDU&#xff0c;数据交互层PDU&#xff1b;N-PDU&#xff1a;NetWork Layer PDU&#xff0c;网络层PDU&#xff0c;通常用的…...

React:从 npx开始

使用 npm 来创建第一个 recat 文件&#xff08; react-demo 是文件名&#xff0c;可以自定义&#xff09; npx create-react-app react-demo npx是 npm v5.2 版本新添加的命令&#xff0c;用来简化 npm 中工具包的使用 原始&#xff1a; 全局安装npm i -g create-react-app 2 …...

力扣热门100题之接雨水【困难】

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3…...

Stable-Diffusion-Webui部署SDXL0.9报错参数shape不匹配解决

问题 已经在model/stable-diffusion文件夹下放进去了sdxl0.9的safetensor文件&#xff0c;但是在切换model的时候&#xff0c;会报错model的shape不一致。 解决方法 git pullupdate一些web-ui项目就可以&#xff0c;因为当前项目太老了&#xff0c;没有使用最新的版本。...

Springboot @Async 多线程获取返回值

Springboot Async 多线程获取返回值 需求背景 最近需要用到多线程, 自己维护线程池很麻烦, 正好看到Springboot集成线程池的例子, 这里自己做了个尝试和总结, 记录一下, 也分享给需要的朋友; 不考虑事务的情况下, 这个多线程实现比较简单, 主要有以下几点: 在启动类加上Enab…...

怎样接入chatGPT

官网链接&#xff1a; OpenAI platform...

Docker consul容器服务更新与发现

Docker consul容器服务更新与发现 一、什么事服务注册与发现二、什么是consul三、consul部署1、consul服务器2、registrator服务器3、consul-template 一、什么事服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可…...

[算法很美打卡] 多维数组篇 (打卡第一天)

文章目录 顺时针打印二维数组0所在的行列清零 顺时针打印二维数组 package 每日算法学习打卡.算法打卡.七月份.七月二十六号;public class test1 {public static void main(String[] args) {int[][] matrix {{1,2},{5,6},{9,10},{13,14},};print(matrix);}static void print(i…...

微服务系列(1)-who i am?

微服务系列&#xff08;1&#xff09;-我是谁 应用架构的演化 简单来说系统架构可以分为以下几个阶段&#xff1a;复杂的臃肿的单体架构-SOA架构-微服务 单体架构及其所面临的问题 在互联网发展初期&#xff0c;用户数量少&#xff0c;流量小&#xff0c;硬件成本高。因此…...

轻量级代码编辑器Lapce从入门到精通:Rust驱动的极速开发体验

轻量级代码编辑器Lapce从入门到精通&#xff1a;Rust驱动的极速开发体验 【免费下载链接】lapce Lightning-fast and Powerful Code Editor written in Rust 项目地址: https://gitcode.com/GitHub_Trending/la/lapce 核心特性解析&#xff1a;为什么选择Rust编写的编辑…...

编译期计算失效?内存布局异常?constexpr调试全链路指南,一线工程师紧急避坑手册

第一章&#xff1a;编译期计算失效&#xff1f;内存布局异常&#xff1f;constexpr调试全链路指南&#xff0c;一线工程师紧急避坑手册识别 constexpr 实际求值时机的三步验证法 当 constexpr 函数在运行时才执行&#xff08;而非编译期&#xff09;&#xff0c;往往因隐式类型…...

5个维度解析League-Toolkit:让英雄联盟玩家实现数据驱动的游戏精进

5个维度解析League-Toolkit&#xff1a;让英雄联盟玩家实现数据驱动的游戏精进 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 引言&#xff1…...

【UE6.5 C++27 调试终极指南】:20年引擎老兵亲授GDB/LLDB/Visual Studio三端协同调试黄金流程

第一章&#xff1a;UE6.5 C27 调试体系演进与核心挑战Unreal Engine 6.5 正式引入对 ISO/IEC 14882:2027&#xff08;C27&#xff09;标准的实验性支持&#xff0c;并重构了底层调试基础设施&#xff0c;以应对现代C语言特性带来的可观测性断层。传统基于符号表与行号映射的调试…...

Pandas数据预览优化:告别Pycharm输出窗口的省略号困扰

1. 数据预览的痛点&#xff1a;被省略号吃掉的关键信息 刚接触Pandas那会儿&#xff0c;我总被Pycharm的输出窗口气得跳脚。明明调用了describe()想看数据分布&#xff0c;结果给我整出一堆省略号&#xff0c;关键统计量全藏在"..."里。最崩溃的是处理宽表时&#xf…...

nli-distilroberta-base模型解析:深入理解其与计算机组成原理的关联

nli-distilroberta-base模型解析&#xff1a;深入理解其与计算机组成原理的关联 1. 引言&#xff1a;当自然语言处理遇上计算机组成原理 你可能已经用过nli-distilroberta-base这个轻量级的自然语言推理模型&#xff0c;但有没有想过它在计算机底层是如何运作的&#xff1f;就…...

JavaScript中函数体代码量对V8内联优化特性的影响

V8是否内联函数取决于函数体的可预测性与优化友好度而非单纯行数&#xff1a;简单、纯函数、低复杂度AST更易内联&#xff1b;含try/catch、eval、闭包等结构即使短也常被拒绝&#xff1b;可通过--trace-inlining验证&#xff0c;优化应重结构清晰而非盲目压缩。函数体代码量直…...

柔性制造企业数字化工厂系统建设方案:制造业数字化全景图、打造5大引擎内核构建工业数字化底座、数据中台与数据治理、典型应用场景示例

本方案针对制造企业信息化痛点&#xff0c;提出基于无代码开发与组装式应用的数字化工厂建设思路&#xff0c;通过数据中台整合多源数据&#xff0c;结合MES、APS、WMS、数字孪生等系统&#xff0c;实现柔性生产、规范化管理与效率提升&#xff0c;助力企业低成本、高柔性、可持…...

QQ空间数据自主权:GetQzonehistory数字记忆保护指南

QQ空间数据自主权&#xff1a;GetQzonehistory数字记忆保护指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字足迹日益成为个人历史重要组成部分的今天&#xff0c;你是否思考过…...

【深度解析】二维半导体晶体管:突破摩尔定律的下一代集成电路核心

1. 二维半导体晶体管的崛起&#xff1a;摩尔定律的终结者&#xff1f; 当硅基芯片的制程工艺逼近1纳米物理极限时&#xff0c;整个集成电路行业都在寻找"后硅时代"的突破口。我第一次在实验室见到二硫化钼&#xff08;MoS2&#xff09;晶体管时&#xff0c;那片厚度不…...