二分图总结

二分图总结

  • 前言
  • 二分图总结
    • 二分图基本概念
      • 什么是二分图?
      • 二分图图的性质
      • 染色法判断是否有奇环
    • 二分图匹配算法
      • 匹配概念
      • 匈牙利算法
      • 二分图最小点覆盖
        • 2,3号边
        • 1,4号边
        • 小结
      • 二分图最小边覆盖
      • 二分图最小路径覆盖
      • 二分图最大独立集

前言

这篇文章是作者在学完二分图的总结,由于作者比较弱,可能只总结了一些皮毛,如果有错误,请大佬指正

二分图总结

二分图基本概念

什么是二分图?

二分图就像名字说的那样,将一幅图二分了,分成两个点集(U,V),并且每一条边都连接着UV**(重!!!:二分图任意点集的点不能连向此点集的点,如U点集的**

点不能连接U点集的点)

二分图图的性质

二分图有一个性质:二分图没有奇环

在一幅图中不能含有奇环,有就说明此图不是二分图。

为什么呢?若含有奇环,那么以相邻两条边表示这两个点属于不同的点集,但是若跑完整个奇

环后,就会出现两个属于相同的点集的两个点,这样的话不就不符合相同点集的点不能相连
了嘛。

染色法判断是否有奇环

染色法其实就是将一个图,分成UVUVUV…这样子,相当于将图分成两个不同的点集,也就是

相邻点不属于同一点集,并进行编号,若冲突表示相邻点的点集相同了则不是二分图。

举个例子:

在这里插入图片描述

1和2相邻,故不同,标称U,V。2和3 相邻,不同,但2已经是V,所以3是U。1和3相邻,故不同,但实际上1和3是相同的,矛盾,不是二分图。

那么代码可以怎么写呢?

我们采用奇偶染色(染色法),就是121212…变换就可以直接用3去减相邻的,比如3-1=2,3-2=1,相当于直接改变了,且改变了奇偶性,所以叫奇偶染色。

bool dfs(int u, int f)
{for (int i = head[u]; i != -1; i = nxt[i]){int v = to[i];if (v != f){if (!belong[v]){belong[v] = 3 - belong[u];if (!dfs(v, u)) return false;}else if (belong[v] == belong[u]) return false;}}return true;
}

二分图样貌展示:

在这里插入图片描述

二分图匹配算法

匹配概念

匹配是指一些边的集合,称作匹配,而这些边指的是二分图两边的点集相连的边(注意:匹配的任意两个边的没有公共点!!!)。

一个匹配中的边的集合中的边,都叫匹配边,如果不在次集合内的边叫非匹配边;而匹配边的两头的点的集合叫做匹配点,也叫盖点,没有在此点集内的,叫未盖点(非匹配点)。

若有一种匹配,它是所有匹配中边的数量最多的,那么我们称其为最大匹配。

二分图中还有一个种匹配,叫完美匹配:二分图中的某个匹配,使得所有点都成了盖点,那么此时就是完美匹配

在这里插入图片描述

匈牙利算法

匈牙利算法本质是一个找增广路的一个算法,因为若出现一条增广路,当前匹配A,肯定会到达匹配B,且B的匹配边的个数是匹配A加1,换句话说,出现增广路,那么我们记录的最大匹配的个数加1

那什么是增广路呢?

首先增广路肯定是条路径对吧,增广路就是指从左边任意一点到右边任
意一点的路径(注:增广路的以右边未盖点结尾),如这样(U为左点集,V为右点集):

U-V-U-V…-U-V的交错路径。

为什么找到增广路最大匹配的个数就加1呢?

一旦出现增广路,路径上的点就会更新新的左或
右的点(换句话说就是更换一下另一半的匹配点),而当更换完成另一半后,自然会空出一个位置,而又因为它是一条路径,自然是相通的,所以那个位置就可以给上面的一个点去匹配
,那么因为最后的点是未盖点,所以此时这条路径上的匹配就会增加。

举个例子子:如下图是一个增广路,如果没有下面一条边,只能匹配一条边,如果加上了呢?你会发现无论上面的匹配边是哪条,在加上最下面的边之后总会增加匹配(最上面的一条是匹配边得话,左边的第二个点可直接匹配右下角的点,匹配边是第二条的话,也能更换成最下面的匹配边,然后上面又能匹配了)
在这里插入图片描述

那么代码该如何写呢?

我们可以采用dfs搜索的写法,每一次枚举左边点集,然后看看右边点集是否构成增广路,不断执行下去。

#define mem(a,b) memset(a,b,sizeof(a))
int vis[N];
int px[N], py[N];
void add(int a, int b)
{to[++E] = b;nxt[E] = head[a];head[a] = E;
}
bool dfs(int x)
{for (int i = head[x]; ~i; i = nxt[i]){int v = to[i];if(!vis[v]){vis[v] = 1;if(py[v] == -1 || dfs(py[v])) //如果到尽头或下面找到尽头了,更新{py[v] = x;px[x] = v;return true;}}return false;
}
void work(int n)
{mem(px, -1);mem(py, -1);for (int i = 1; i <= n; ++i){	mem(vis, 0);if(dfs(i)) ++ret;}
}

二分图最小点覆盖

二分图最小点覆盖自然是用最少的点去覆盖二分图所有的边。

此问题我们可以先跑一遍最大匹配,再将其分成四个情况:

1:匹配边
2:左盖右未盖
3:左未盖右盖
4:左右都盖
在这里插入图片描述

2,3号边

只需要选已盖点就行了。不过若2,3号边的已盖点在同一条边怎么办?

其实根本就不用担心,若存在这种情况,必定会出现增广路,但此时已经是最大匹配,就与前面冲突,矛盾,所以不存在这种情况。

1,4号边

问题主要在上面的2,3号边没选到1,4号边的盖点怎么办?其实若没有的话,证明没有一个未盖点能到达1,4号边的盖点,所以左右随便选。

小结

至此,我们搞定所有情况,如此看来,最小点覆盖就是最大匹配的边数,也就是最小点覆盖等于最大匹配

二分图最小边覆盖

二分图最小边覆盖自然就是用最少的边数覆盖所有点。

分析一下,除去我们的最大匹配,剩下的n-ans * 2个点就用同样多的边去覆盖(ans为最大匹配)。

为什么呢?

想一下,若存在两个未盖点中间有边,那么最大匹配就不是ans了,又因为ans是最大匹配,矛盾,故不会出现这种情况。

还有,要注意,因为不存在两个未盖点之间有条边,那么两头之间肯定有盖点,可是之前已经覆盖过了,所以要舍弃那一半的盖点和边。

最终,答案就是n - ans * 2 + ans,由于重复了ans条边,故要减去。

二分图最小路径覆盖

一个有向图,用最少且不相交的路径覆盖所有的点。

我们可以将图转化成二分图,左边表示出度,右边表示入度。那么刚开始的路径个数就是n。

我们可以跑一遍最大匹配,在跑的过程中,若匹配加1,证明出现了增广路, 那么此时就说明可以省去一条路径了, 所以最大匹配等于最大能省去多少条路径,那么最小路径覆盖就等于n-最大匹配

二分图最大独立集

独立集:⼀个点集,点集内的点两两不相邻
若刚开始时选了所有点,那么连边的肯定得删去一头,但是至于删哪边,我们要考虑删连边
的多的,这样的话可以切断许多连通。
但是最小点覆盖正是选连边多的,所以最大独立集就可以是n-最小点覆盖

匹配等于最大能省去多少条路径,那么最小路径覆盖就等于n-最大匹配

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

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

相关文章

conda加速下载

目录 一、镜像源设置 1、查看当前的下载源&#xff08;初始&#xff09; 2、修改国内源 二、附录 1、还原默认源 2、移除指定源 3、EBUG:urllib3.connectionpool:Starting new HTTPS connection (1): repo.anaconda.com:443的解决方法 4、可以指定网址安装 一、镜像源设…

答题小程序的轮播图管理与接入获取展示实现

实现了答题小程序的轮播图管理&#xff0c;包括上传图片、设置轮播图、操作上下线等功能&#xff0c;可用于管理各类答题小程序的轮播图。 轮播图前端接入代码 答题小程序内使用以下代码接入轮播图&#xff1a; WXML&#xff1a; <view style"width: 100%"> …

最少钱学习并构建大模型ollama-llama3 8B

学习大模型时可能面临一些困难&#xff0c;这些困难可能包括&#xff1a; 计算资源限制&#xff1a;训练大模型通常需要大量的计算资源&#xff0c;包括CPU、GPU等。如果设备资源有限&#xff0c;可能会导致训练时间长、效率低下或无法完成训练。 内存限制&#xff1a;大模型通…

AI绘画SD必学技能—从零开始训练你的专属Lora 模型!StableDiffusion模型训练保姆级教程建议收藏!

大家好&#xff0c;我是画画的小强 接触AI绘画的小伙伴&#xff0c;一定听过Lora。 Lora模型全称是&#xff1a;Low-Rank Adaptation of Large Language Models&#xff0c;可以理解为Stable-Diffusion中的一个插件&#xff0c;在生成图片时&#xff0c;Lora模型会与大模型结…

数学建模比赛(国赛)水奖攻略

之前很多同学私聊问我&#xff0c;学校要求参加数模比赛&#xff0c;但是不擅长建模编程&#xff0c;但又不想浪费这个时间该怎么办呢&#xff0c;今天就来给大家讲一下大家都非常感兴趣的内容——数学建模水奖攻略。分享一下博主直接参加比赛时候的经验。 一、选题技巧 有一句…

【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数

链式调用 用一个函数的返回值&#xff0c;作为另一个函数的参数 def isOdd(num): if num % 2 0: return False return True def add(x, y): return x y print(isOdd(add(3,4)))""" 运行结果"""这里就是先算出 add 的值&#xff0c;然后…

使用ftl文件导出时,多层嵌套循环

核心点 //针对集合1进行循环 <#list priceDetail as pd>//对集合1中包含的集合2进行存在和判空 判断<#if pd.detail ?exists && pd.detail ?size!0> //对集合2进行循环<#list pd.detail as d>...</#list></#if></#list> 模版…

wincc报警如何通过短信发送给手机

单位使用WINCC上位机监控现场&#xff0c;需要把报警信息发送到指定手机上&#xff0c;能否实现&#xff1f;通过巨控GRMOPC系列远程智能控制终端&#xff0c;简单配置即可实现wincc报警短信传送到手机。配置过程无需任何通讯程序&#xff0c;也不要写任何触发脚本。 GRMOPC模…

【数据结构】归并排序

1、介绍 归并排序&#xff08;merge sort&#xff09;是一种基于分治策略的排序算法&#xff0c;包含“划分”和“合并”阶段。 划分阶段&#xff1a;通过递归不断地将数组从中点处分开&#xff0c;将长数组的排序问题转换为短数组的排序问题。 合并阶段&#xff1a;当子数组…

基于SpringBoot的闲一品交易平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 Java技术 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 首页 管理员…

PaddleNLP 3.0 支持大语言模型开发

huggingface不支持模型并行。张量并行&#xff0c;不满足大规模预训练的需求。 1、组网部分 2、数据流 3、训练器 4、异步高效的模型存储

【探索数据结构与算法】向上调整建堆与向下调整建堆的时间复杂度

一.前言 堆排序是一种优于冒泡排序的算法, 那么在进行堆排序之前, 我们需要先创建堆, 那么这个建堆的时间复杂度是多少呢? 二.下调整算法建堆 因为堆是完全二叉树&#xff0c;而满二叉树也是完全二叉树&#xff0c;此处为了简化使用满二叉树来证明(时间复杂度本来看的就是近…

android13 隐藏状态栏里面的背光调节 隐藏下拉栏背光调节

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.修改方法 4.编译运行 5.彩蛋 1.前言 隐藏下拉栏里面的背光调节,禁止用户在这里调节背光亮度。 2.问题分析 我们找到对应的布局,然后在里面隐藏掉。 使用之前文章介绍的布局查找工具,查找亮度条id id/bri…

Adobe Animate (AN)软件安装,硬件配置(附安装包)

目录 一、Adobe An 软件简介 Adobe An 软件的特点 Adobe An 软件的优势 下载 二、Adobe An 软件安装 安装前的准备工作 安装过程中的注意事项 安装后的设置 三、Adobe An 软件使用 高级动画技巧 交互设计 优化与性能提升 四、Adobe An 软件快捷键 选择工具快捷键…

闲置物品交易平台网站商城-计算机毕设Java|springboot实战项目

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

线索精细化管理实践:线上推广渠道线索管理的8个要点

在如今线索获取成本越来越高的情况下&#xff0c;如何获取增量线索、经营好存量线索、实现精细化、高效率线索管理对于企业来说至关重要。获取线索是一切行动的开始&#xff0c;与其建立起稳定、持续的信任关系&#xff0c;达成合作甚至引导复购&#xff0c;是整个线索管理链路…

在网站文章中,‌<br>标签对SEO的影响及优化策略

在网页设计和内容创作中&#xff0c;‌<br>标签常被用于实现文本的换行显示。‌然而&#xff0c;‌对于关注SEO&#xff08;‌搜索引擎优化&#xff09;‌的网站管理员和内容创作者来说&#xff0c;‌<br>标签的使用却需要更加谨慎。‌这是因为<br>标签对SEO…

入门redis

一、安装redis-py库 打开pycharm 在终端中输入 pip install redis 二、连接到redis服务器 import redis r redis.Redis(hostlocalhost, port6379, db0, decode_responsesTrue)host是 Redis 服务器的主机名或 IP 地址&#xff0c;port是端口号&#xff0c;db是要使用的数据库编…

【Word多级标题完整设置】设置各级标题样式将多级列表链接到各级标题样式中

Word多级标题完整设置 一、设置各级标题样式主标题样式设置中英文字体、字形以及字号设置段落设置&#xff08;缩进、间距和行距&#xff09; 一级标题样式设置中英文字体、字形以及字号设置段落设置&#xff08;缩进、间距和行距&#xff09; 二级标题样式设置中英文字体、字形…

看图学sql之sql 中的UNION 和union all

UNION 用于合并两个或者多个 SELECT 语句的结果集 语法&#xff1a; SELECT column1, column2 ... FROM table1, table2 [WHERE condition1]UNION / UNION ALLSELECT column1, column2 ... FROM table1, table2 [WHERE condition2] 数据分析社区直达 免费数据分析资料下载。…