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

【图论】二分图

二分图,即可以将图中的所有顶点分层两个点集,每个点集内部没有边

判定图为二分图的充要条件:有向连通图不含奇数环

1、染色法

可以解决二分图判断的问题

步骤与基本思路

遍历图中每一个点,若该点未被染色,则遍历该点所相邻的点,相邻的点中未被染色的进行染色操作,已被染色的判断颜色是否合法,合法继续遍历,不合法退出

染色法板子

bool flag = true;
for (int i = 1; i <= n; i ++ )
{if (!color[i]) // 未被染色则开始遍历{if (!dfs(i, 1)){flag = false;break;}}
}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]) // 未被染色的点进行染色{if (!dfs(j, 3 - c)) return false;}else if (color[j] == c) return false; // 已染色的点判断是否合法}return true;
}

2、匈牙利算法

可以解决最大匹配数的问题,也就是二分图的两个点集可以连多少条一一对应的边

步骤与基本思路

(1)遍历第一个点集的所有点,每个点遍历之前要记得把第二个点集的状态清空

(2)依次遍历这些点相邻的点,若该点未被遍历过,则判断该点是否满足未与前面的点匹配过或前面与它匹配的点有其他的匹配方案,若满足任意条件则让现在的两点匹配,不满足则说明当前第一个点集的这个点没有匹配对象

匈牙利算法板子

for (int i = 1; i <= n1; i ++ )
{memset(st, false, sizeof st); // 清空第二个点集的状态if (find(i)) res ++ ;
}bool find(int x)
{for (int i = h[x]; i != -1; i = ne[i]){int j = e[i];if (!st[j]) // 若该点未被遍历过{st[j] = true;// 该点是否满足 未被匹配过 or 匹配的第一个点集的点有其他成功匹配方案if (match[j] == 0 || find(match[j])){match[j] = x; // 匹配现在的这两点return true;}}}return false;
}

http://www.lryc.cn/news/95476.html

相关文章:

  • 数据结构——(一)绪论
  • [ 华为云 ] 云计算中Region、VPC、AZ 是什么,他们又是什么关系,应该如何抉择
  • 表单验证:输入的字符串以回车分隔并验证是否有
  • 智能财务分析-亿发财务报表管理系统,赋能中小企业财务数字化转型
  • 图为科技T501赋能工业机器人 革新传统工业流程
  • 安全狗深度参与编写的《云原生安全配置基线规范》正式发布!
  • 如何在3ds max中创建可用于真人场景的巨型机器人:第 2 部分
  • Vue中TodoList案例_编辑
  • 什么是Redis?
  • 深入浅出理解vue2/vue3响应式原理
  • ssh连接服务器配置
  • el-table 表头设置渐变色
  • GB/T 25000.51解读——软件产品的易用性怎么测?
  • 408复试day2(7大排序算法)
  • Vue消息订阅与发布
  • MySQL学习笔记 ------ 分组查询
  • Matlab 点云平面特征提取
  • vite的介绍
  • 裁员 10%,暴跌 14%,这家 IT 独角兽正在被抛弃!
  • 电脑记事本在哪里?电脑桌面显示记事本要怎么设置?
  • 微服务笔记---Nacos集群搭建
  • python 小案例
  • 【SpringBoot】SpringBoot JPA 基础操作(CURD)
  • 大数据技术之Hive3
  • Spring Boot实践二
  • python:基于GeoPandas和GeoViews库将GEDI激光高程数据映射到交互式地图
  • 汇编实现strcpy
  • Appium+python自动化(二十四) - 元素等待(超详解)
  • NFT市场泡沫破裂了吗?投资NFT是否仍然安全?
  • k8s使用helm部署Harbor镜像仓库并启用SSL