二分图

news/2024/9/23 18:15:11

二分图总结

一是 太长时间不写博客,觉得对不起这个账号 二是记录一下对二分图的建边和含义的理解

首先 我们要知道二分图的三个性质
1.二分图的一组匹配 M 是最大匹配,当且仅当图中不存在 M 的增广路。
2.二分图中最小点覆盖数=最大匹配数
3.二分图中最大独立集数=n-最小点覆盖数、
然后 基于二分图的"匹配"的两点唯一对应的性质 所以我们可以将其视为一种映射

匈牙利算法

`

// 匈牙利算法求最大匹配
int xyl() {int ans = 0; // 记录最大匹配数for (int i = 1; i <= n; i++) {memset(vis, 0, sizeof(vis));// 找到一条增广路,匹配数+1if (dfs(i)) ans++;}
}
bool dfs(int now) 
{for (int i = head[now]; i; i = edge[i].nxt) {int to = edge[i].to;if (!vis[to]){vis[to] = true;if (!match[to] || dfs(match(to))) {match[to] = now;return true;}}}return false;
}

`

理解

对于目前题库中有的题 ,所有的题都可以分为两种对应(映射) ,相同含义的对应和不同含义的对应

不同含义

如 文理分班中的人和椅子,Asteroids 穿越小行星群中的行和列,超级英雄中的题目和锦囊妙计,想这样具有不同的对应关系

注意 即使如田忌赛马中双方的马也不能认为 同类(没有具体的题,所以拿这个成语举下例子)

对于这样的题往往需要建单向边

但这样会有一个问题 点的名称重复但含义不同

例如 以 Asteroids 穿越小行星群 为例
当我们需要将 第一行 和 第三列 建立联系时 如果不加思考
会直接
add(1,3)
但 稍加思考 为了避免其重复带来的影响
add(1,3+n)//n为总列数
但 再加思考 我们会发现 这两种其实是一样的

其关键在于match数组的应用

设将行对应的点的集合设为 V1 将列对应的点设为 V2
image

在二分图中由add函数添加的边都为由v1指向指向v2 即未匹配边

由match 数组建立的边都为匹配边
eg add(1,3) match[4][2]
image
所以这就解释为什么在xyl()函数中为什么可以将n个点全部遍历 并且为什么在该类题中只能加单向边 因为每一次的寻找新匹配都由v1中的点出发,其v2中即使有名称相同的点 也会因v2中的出边都由match数组管控,而不互相影响,相当于与add()函数是两套存边系统

所以在用add()数组建完边后 全部为由v1,到v2的单向边,而 如果存在match[y]=x 那么一定有add(x,y)
此时 二分图 是 无向图的性质得以体现 ,且建立的 匹配数 即为 无向边数 且一一对应

相同含义

在相同含义的题中,要保证v1,v2中的点完全相同
如题库中 猫与狗 的人与人
而 对于 为什么 答案为 n-xly()/2 可以这样理解
对于 一对 矛盾关系 其建边方式由以下两种 来自HDK

点击查看代码

#1for(int i=1;i<=n;++i){for(int j=1;j<=n;++j){if(like[i]==dislike[j]||dislike[i]==like[j]){e[i].push_back(j);}}}#2for(int i=1;i<=n;++i){for(int j=1;j<=n;++j){if(like[i]==dislike[j]){e[i].push_back(j);e[j].push_back(i);}}}

如果 1,3 有矛盾, 那么从 V1 的‘1’到 V2 的‘3’ 和 V1 的‘3’到 V2 的‘1’ 都会建边
所以

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Linux服务

1.备份服务Rsync使用模式rsyncd服务与客户使用流程 2.存储服务NFS原理(network file system)(RPC-remote procefure call) NFS相关的文件 3.Sersync同步架构 sersync依赖于rsync服务端 完成小项目: 用户上传文件到web服务器,web服务器挂载nfs,nfs实时同步到备份服务器上.实…

华企盾DSC数据防泄密软件有哪些水印?

在企业数据安全领域,水印技术是一种重要的信息保护策略,用于防止数据泄露和确保信息的原始性和完整性。根据回顾的资料,以下是企业中常用的几种水印技术:屏幕浮水印:这种水印能够在用户的屏幕上显示公司的标志或者其他重要信息,用于防止拍照泄密。用户可以自定义屏幕浮水…

程序员的AI编程小助手,CodeGeeX使用体验总结

程序员的AI编程小助手,CodeGeeX使用体验总结 :::warning 一、1.CodeGeeX 是什么?能做什么?CodeGeeX 是一个智能编程软件工具,目前CodeGeeX支持多种主流IDE,如VS Code、visual studio 2022,IntelliJ IDEA、PyCharm、Vim等, 同时,支持Python、Java、C++/C、JavaScript、G…

父组件先校验再同步子组件方法

子组件 父组件 必须是return promise 对象

springboot项目启动会报4个加载不到的debug提示,可改可不改

1. 因为启动的时候会报提示: Unable to locate LocaleResolver with name localeResolver: using default [org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver@17162122]有4个这样的--Resolver,(具体每个Resolver在下面注释有说明)要想不报这个加载提示,如…

开源自定义表单系统为何获得青睐?

今天,我们就与大家一起分享开源自定义表单系统、低代码技术平台的相关优势特点,感兴趣的朋友可以体验一番。想要实现提质增效的办公效率,利用低代码技术平台及开源自定义表单系统,可以满足大众业务需求。这也是为何开源自定义表单系统深受青睐的原因之一了。很多企业不了解…

java 查看jdk位置

1、java -verbose -version 2、查看项目使用的jdk以及位置

[ida pro] 设置RVA 偏移

在使用IDA PRO分析X64 异常展开,进行_SCOPE_TABLE类型设置时,将操作数转换为偏移量目录示例:UNWIND_INFO 分析1、添加ScopeRecord类型2、设置类型3、将操作数转换为偏移量4、设置完成链接1链接2 示例:UNWIND_INFO 分析_C_specific_handler_0 是一个导入函数,是进行异常处理…