二分图算法总结 C++实现

总体概念

图源ACWING

染色法

基本思路步骤

  1. 将所有的边及其相接的边用邻接表存储起来;
  2. 遍历所有的点,找到未上色的点;
  3. 用BFS将该点及其相接的点迭代上色;
  4. 在上述染色步骤中,如果相邻点的颜色相同则无法形成二分图;

题目

图源ACWING

题解

在这里插入图片描述
原链接:https://www.acwing.com/solution/content/105874/

代码实现

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 100010 * 2;//因为是无向图,所以每两个点之间的边要存储两次
int e[N], ne[N], idx;//邻接表存储图
int h[N];
int color[N];//保存各个点的颜色
int 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;//u的点成 c 染色//遍历和 u 相邻的点for(int i = h[u]; i!= -1; i = ne[i]){int j = e[i];                   if(!color[j])//相邻的点没有颜色,则递归处理这个相邻点{if(!dfs(b, 3 - c)) return false;//(3 - 1 = 2, 如果 u 的颜色是2,则和 u 相邻的染成 1)//(3 - 2 = 1, 如果 u 的颜色是1,则和 u 相邻的染成 2)}else(color[j] == c)//如果已经染色,判断颜色是否为c{                                     return false;//如果是,说明冲突,返回                   }}return true;
}int main()
{memset(h, -1, sizeof h);//初始化邻接表cin >> n >> m;for(int i = 1; i <= m; i ++)//读入边{int a, b;scanf("%d%d", &a, &b);add(a, b), add(b, a);}for(int i = 1; i <= n; i ++)//遍历点{if(!color[i])//如果没染色{if(!dfs(i, 1))//染色该点,并递归处理和它相邻的点{cout << "No" << endl;//出现矛盾,输出NO return 0;}}}cout << "Yes" << endl;//全部染色完成,没有矛盾,输出YESreturn 0;
}作者:Hasity
链接:https://www.acwing.com/solution/content/105874/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

匈牙利算法

基本思路步骤

  1. 邻接表存储边;
  2. 遍历左侧的点,接着遍历与其相连的在右侧点(二分图点被划分为左右两侧);
  3. 找到未连过其他点的点与其相连;
  4. 如果该点已经连接,尝试让连接这个点的左侧的点重新连接其他点;

题目

图源ACWING

具体题解

在这里插入图片描述
原链接:https://www.acwing.com/solution/content/179030/

代码实现

#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;const int N = 510, M = 1e5 + 10;int h[N], e[M], ne[M], idx;//邻接表储存边
int match[N];//match[i] = j表示与点i相连的点是j;是记录整个过程配对情况的数组;
bool st[N];//遍历到左侧一个点时,判断右侧的点是否被该点访问过了;是记录一次循环的访问情况的数组;
int n1, n2, m;
int res;//结果集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])//遍历与点x相连的点{int j = e[i];if(!st[j])//如果没有被x访问过{st[j] = true;//将其标记为true,防止重复访问;if(match[j] == 0 || find(match[j]))//如果该点没有与其他点配对过 或者 与该点配对的点能找到其他的点与其配对;{match[j] = x;return true;}}}return false;
}int main()
{cin >> n1 >> n2 >> m;memset(h, -1, sizeof h);int a, b;while(m -- ){scanf("%d%d", &a, &b);add(a, b);}for(int i = 1;i <= n1;i ++ ){memset(st, false, sizeof st);//每次访问右侧的点时,需将st全赋值为false防止被上次循环的find影响本次find的访问;if(find(i)){res ++ ;}}cout << res;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构:单链表OJ题

目录 相交链表解题思路代码 环形链表&#xff08;I&#xff09;解题思路代码 环形链表&#xff08;II&#xff09;解题思路代码 随机链表的复制&#xff08;深拷贝&#xff09;解题思路代码 相交链表 题目描述&#xff1a; 案例&#xff1a; 题目链接&#xff1a;https://l…

FunASR离线文件转写服务开发指南-debian-10.13

FunASR离线文件转写服务开发指南-debian-10.13 服务器环境 debian10.13 64位 第一步 配置静态网卡 auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 8.8.8.8 8.8.4.4/etc/init.d/networking restart第…

【JVM】JMM

文章目录 前置的硬件知识什么是JMMJMM的三大特性JMM中定义的原子操作happens-before先行发生原则 前置的硬件知识 硬件存储体系: 运行速度从上到下依次减慢. 由于CPU的计算速度远超与内存的处理速度,所以CPU不会直接从内存中读写,而是将内存中的变量拷贝一份副本放到CPU高速…

2022年下真题(案例分析)

一、数据流图 二、数据库设计 - ER图 三、面向对象设计 - 用例图、类图 四、算法

【人工智能】AI人工智能的重要组成部分,深入解析CNN与RNN两种神经网络的异同与应用场景和区别

文章目录 一、卷积神经网络&#xff08;CNN&#xff09;详解1. 特征与结构CNN的基本结构 2. 应用场景3. 代码示例 二、循环神经网络&#xff08;RNN&#xff09;详解1. 网络结构与特点RNN的基本结构 2. 应用场景3. 代码示例 三、CNN与RNN的异同点1. 相同点2. 不同点 四、CNN与R…

基于YOLOv8-deepsort算法的智能车辆目标检测车辆跟踪和车辆计数

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

Vue使用@别名替换后端ip地址

1. 安装 types/node types/node 包允许您在TypeScript项目中使用Node.js的核心模块和API&#xff0c;并提供了对它们的类型检查和智能提示的支持。 npm install types/node --save-dev 比如安装之后&#xff0c;就可以导入nodejs的 path模块&#xff0c;在下面代码 import path…

闪电麦昆 语音控制齿轮行进轨迹,ESP32搭配语音控制板,串口通信,附视频演示地址

演示地址 https://www.bilibili.com/video/BV1cW421d79L/?vd_sourceb8515e53f6d4c564b541d98dcc9df990 语音控制板的配置 web展示页面 esp32 程序 #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <LittleFS.h> #include <WebSo…

STL之set、map的使用

STL之set、map 1. 序列式容器和关联式容器2. set系列的使⽤参考文档链接&#xff1a;2.1 set的介绍&#xff08;2&#xff09;set的增删查2.2 multiset的介绍 3 map3.1 参考文档3.2 map类的介绍3.3 pair类型介绍3.4 map的构造3.6 map的数据修改3.7 multimap和map的差异 1. 序列…

openpdf

1、简介 2、示例 2.1 引入依赖 <dependency><groupId>com.github.librepdf</groupId><artifactId>openpdf</artifactId><version>1.3.34</version></dependency><dependency><groupId>com.github.librepdf</…

python+yaml+pytest+allure接口自动化框架

建议想学自动化的同学&#xff0c;先花半个月一个月的时间&#xff0c;去b站极限学习一下有关python的基础内容&#xff0c;比如各种数据类型的特点&#xff0c;创建 转换等&#xff0c;还有面向对象的一些知识&#xff0c;否则直接看自动化框架&#xff0c;很难看懂理解&#…

根据请求错误的状态码判断代理配置问题

SafeLine&#xff0c;中文名 “雷池”&#xff0c;是一款简单好用, 效果突出的 Web 应用防火墙(WAF)&#xff0c;可以保护 Web 服务不受黑客攻击。 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL 注入、XSS、 代码注入、命…

2024顶级一区idea:多模态图像融合!

在图像处理的前沿领域&#xff0c;多模态图像融合技术正成为研究的热点&#xff0c;它通过整合来自不同来源的图像数据&#xff0c;为我们提供了更丰富的信息维度&#xff0c;从而显著提升图像处理的精确度和效率。 这项技术的核心优势在于能够捕捉并融合各种图像数据中的互补…

3D渲图软件推荐:打造高质量渲染效果

在现代设计领域&#xff0c;3D渲图已经成为展示设计方案和产品外观的重要手段。无论是建筑设计、产品设计还是影视动画&#xff0c;都需要借助专业的3D渲染图软件来实现逼真的视觉效果。 本文将为您介绍几款备受好评的3D渲染图软件&#xff0c;帮助您在项目中选择合适的工具。…

户外防火值守:太阳能语音监控杆的参数及技术特点

随着假期旅游的热潮日渐高涨&#xff0c;我们游览各大景区、公园或森林区域时&#xff0c;经常会与各种智能设备不期而遇。这些高科技产品不仅提升了旅游体验&#xff0c;更在无形中保障了游客的安全与景区的环境保护。在我最近的旅行经历中&#xff0c;尤其是在深圳大鹏旅游景…

开放式蓝牙耳机排行榜10强?分享值得安利的开放式耳机

​开放式耳机目前非常流行&#xff0c;它们以时尚、美观和舒适著称&#xff0c;迅速赢得了众多用户的喜爱&#xff0c;成为了耳机市场的新宠。与传统的入耳式耳机相比&#xff0c;开放式耳机佩戴更稳固&#xff0c;对耳朵也更为温和。尽管有些人认为它们价格不菲&#xff0c;甚…

项目_C_Ncurses_Flappy bird小游戏

Ncurses库 概述 什么是Ncurses库&#xff1a; Ncurses是一个管理应用程序在字符终端显示的函数库&#xff0c;库中提供了创建窗口界面、移动光标、产生颜色、处理键盘按键等功能。 安装Ncurses库&#xff1a; sudo apt-get install libncurses5-dev 头文件与编译&#xf…

Springboot自定义starter注入到第三方项目IOC容器里

一 Bean扫描 Springboot项目&#xff0c;我们不加ComponentScan注解&#xff0c;但是也能扫描到Controller、Service标记的类&#xff0c;为什么呢&#xff1f;关键在于启动类的SpringBootApplication注解&#xff0c;该注解由以下三个注解组成&#xff1a; SpringBootConfig…

关于BSV区块链覆盖网络的常见问题解答(下篇)

​​发表时间&#xff1a;2024年9月20日 在BSV区块链上的覆盖网络服务为寻求可扩展、安全、高效交易处理解决方案的开发者和企业家开辟了新的视野。 作为开创性的曼达拉升级的一部分&#xff0c;覆盖网络服务提供了一个强大的框架&#xff0c;用于管理特定类型的交易和数据访问…

如何将 html 渲染后的节点传递给后端?

问题 现在我有一个动态的 html 节点&#xff0c;我想用 vue 渲染后&#xff0c;传递给后端保存 思路 本来想给html的&#xff0c;发现样式是个问题 在一个是打印成pdf&#xff0c;然后上传&#xff0c;这个操作就变多了 最后的思路是通过 html2canvas 转化成 canvas 然后变成…