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

二分图

 数据结构、算法总述:数据结构/算法 C/C++-CSDN博客


二分图节点由两个集合组成,且两个集合内部没有边的图。换言之,存在一种方案,将节点划分成满足以上性质的两个集合。

染色法

目的:验证给定的二分图是否可以进行二色染色

时间复杂度是 O(n+m)
int n;      // n表示点数
int h[N], e[M], ne[M], idx;     // 邻接表存储图
int color[N];       // 表示每个点的颜色,-1表示未染色,0表示白色,1表示黑色// 参数:u表示当前节点,c表示当前点的颜色
bool dfs(int u, int c)
{color[u] = c;for (int i = h[u]; i != -1; i = ne[i]){int j = e[i];if (color[j] == -1){if (!dfs(j, !c)) return false;}else if (color[j] == c) return false;}return true;
}bool check()
{memset(color, -1, sizeof color);bool flag = true;for (int i = 1; i <= n; i ++ )if (color[i] == -1)if (!dfs(i, 0)){flag = false;break;}return flag;
}

题目:

860. 染色法判定二分图 - AcWing题库icon-default.png?t=N7T8https://www.acwing.com/problem/content/862/

匈牙利算法

我们可以看做一个月老在牵红线,现在左边是男生,右边是女生,互相都有心仪的对象,我们就要尽量每一个男生都好。然后就出现了一个图。

我们先看第一个男生,他有两个心仪的对象,先看第一个女生,还是单身,那就选第一个,然后看下一位,也是第一个单身,就她了。但是第三位男生就出问题了,他只有一位心仪的对象,但是呢,那位已经有对象了,但是这位男生还是不放弃,找到那个男朋友,说:“要不你换一换”。我们再一看,确实还有一个备胎单身,就换一个,这样两个人都好,最后一个也很正常,直接匹配。所以总结出十六字真言:待字闺中,据为己有;名花有主,求他放手。 所以说这也告诉我们不要轻易放弃,最后悔的不是做错,而是错过。

时间复杂度 O(n*m),实际运形时间远小于n*m
int n1, n2;     // n1表示第一个集合中的点数,n2表示第二个集合中的点数
int h[N], e[M], ne[M], idx;     // 邻接表存储所有边,匈牙利算法中只会用到从第一个集合指向第二个集合的边,所以这里只用存一个方向的边
int match[N];       // 存储第二个集合中的每个点当前匹配的第一个集合中的点是哪个
bool st[N];     // 表示第二个集合中的每个点是否已经被遍历过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 res = 0;
for (int i = 1; i <= n1; i ++ )
{memset(st, false, sizeof st);if (find(i)) res ++ ;
}

题目:

861. 二分图的最大匹配 - AcWing题库icon-default.png?t=N7T8https://www.acwing.com/problem/content/863/

相关文章:

  • web CSS笔记1
  • lua 获取指定路径下的所有文件夹
  • 批量删除 rabbitmq中随机队列
  • c++部分题
  • PCL点云处理之最小中值平方(Lmeds法)拟合平面(二百三十四)
  • 鸿蒙OS开发实例:【手撸服务卡片】
  • 【Linux】详解进程程序替换
  • 基于前端技术实现的全面预算编制系统
  • 利用RWKV-Runner初步感受一下ai的世界
  • Linux的学习之路:3、基础指令(2)
  • SpringBoot集成WebSocket(实时消息推送)
  • PL/SQL的词法单元
  • ida调试技巧-通过修改zf寄存器的值绕过简单反调试
  • Linux manim安装
  • 幻兽帕鲁服务器价格太卷了,4核16G游戏联机服务器价格24元
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • Brief introduction of how to 'Call, Apply and Bind'
  • ES6系统学习----从Apollo Client看解构赋值
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • iOS小技巧之UIImagePickerController实现头像选择
  • Java|序列化异常StreamCorruptedException的解决方法
  • Java多线程(4):使用线程池执行定时任务
  • JS学习笔记——闭包
  • Laravel 菜鸟晋级之路
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • tweak 支持第三方库
  • TypeScript迭代器
  • Vue.js-Day01
  • 从重复到重用
  • 高程读书笔记 第六章 面向对象程序设计
  • 关于Java中分层中遇到的一些问题
  • 回顾 Swift 多平台移植进度 #2
  • 漂亮刷新控件-iOS
  • 前端_面试
  • 前端技术周刊 2019-01-14:客户端存储
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何选择开源的机器学习框架?
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 优秀架构师必须掌握的架构思维
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​水经微图Web1.5.0版即将上线
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (十一)手动添加用户和文件的特殊权限
  • .Net 6.0 处理跨域的方式
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .net反混淆脱壳工具de4dot的使用
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [20160902]rm -rf的惨案.txt
  • [Android] Android ActivityManager