首页 > 其他分享 >二分图

二分图

时间:2024-05-13 18:20:41浏览次数:14  
标签:二分 匹配 含义 v2 add match

二分图总结

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

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

匈牙利算法

`

// 匈牙利算法求最大匹配
int xyl() {
	int ans = 0; // 记录最大匹配数
	for (int i = 1; i <= n; i++) {
		memset(vis, 0, sizeof(vis));
		// 找到一条增广路,匹配数+1
		if (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

点击查看代码

#1
	for(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);
			}
		}
	}

#2
	for(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’ 都会建边
所以

标签:二分,匹配,含义,v2,add,match
From: https://www.cnblogs.com/CTHoi/p/18189604

相关文章

  • # 如何优雅的写出二分
    二分查找二分法查找单个值题目:给定一个n个有序的(升序)数组nums和一个目标值target,写一个函数搜索nums中target,如果目标值存在返回下标,否则返回-1;关键词:有序数组,无重复元素难点:区间选择及循环不变量在每次循环中要坚持循环不变量原则(名字不重要,怎么做很重要)  如果我们在......
  • 二分图(例题)
    https://www.cnblogs.com/kuangbiaopilihu/p/18184536$\quad$这里不再介绍二分图的基础知识,只是一些例题的解释。$\quad$当然,这道题可以用二分+并查集来解决。但这是二分图专辑,所以介绍一下二分图做法。$\quad$首先如果两个罪犯之间有仇恨,那么当他们不在同一......
  • 洛谷 P2824 [HEOI2016/TJOI2016] 排序(二分,线段树)
    传送门解题思路据说是经典思路:把多次排序转化成二分+01序列。首先二分所求位置的数字是啥,将大于mid的数字变成1,将小于等于mid的数字变成0。这样在排序的时候就相当于统计区间里的1的个数(区间和),然后区间全部变成0或者1。也就是区间修改,区间求和,线段树可以实现。AC代码#inclu......
  • 匈牙利算法模板(二分图)
    booldfs(intnow){for(inti=h[now];i;i=nxt[i]){intt=to[i];//这里不用考虑会有回到父结点的边的问题//因为每次都是从左部找邻接点if(!vis[t]){vis[t]=true;//如果邻接点t是非匹配点,则找到一条增广路,匹配......
  • 加练日记2-二分,双指针,排序
    二分模板 #include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constllMOD=998244353;lln,m;constllN=2e5+9;lla[N];llv[N];intf(llmid){ llans=0,pre=-1e9; for(inti=1;i<=n;i++){ if(a[i]-pre>=mid)ans++,pre=a[i......
  • 蓝桥杯-递增三元组(三种解法,二分, 双指针, 前缀和)
    给定三个整数数组A=[A1,A2,…AN],B=[B1,B2,…BN],C=[C1,C2,…CN],请你统计有多少个三元组(i,j,k)满足:1≤i,j,k≤NAi<Bj<Ck输入格式第一行包含一个整数N。第二行包含N个整数A1,A2,…AN。第三行包含N个整数B1,B2,…BN。第四行包含N个整数C1,C2,…CN。输出格......
  • 二分图
    1.二分图的概念二分图,又称二部图,英文名叫Bipartitegraph。如果一张无向图的\(N\(N≥2)\)个节点,可以分成A、B两个非空集合,其中\(A∩B=Φ\),并且在同一集合内的点之间都没有边相连,那么称这张无向图为一张二分图。A、B分别称为二分图的左部和右部。如下图所示。2.二......
  • 代码随想录算法训练营第第一天 | 704. 二分查找 、27. 移除元素
    704、二分查找题目链接:https://leetcode.cn/problems/binary-search/文章讲解:https://programmercarl.com/0704.二分查找.html视频讲解:https://www.bilibili.com/video/BV1fA4y1o715`varsearch=function(nums,target){letleft=0;letright=nums.length;letmi......
  • 代码随想录算法训练营第一天 | 704.二分查找 27.移除元素
    704.二分查找题目链接:https://leetcode.cn/problems/binary-search/文档讲解:https://programmercarl.com/0704.二分查找.html视频讲解:https://www.bilibili.com/video/BV1fA4y1o715左闭右开时间复杂度O(logn)空间复杂度O(1)classSolution{public:intsearch(......
  • 二分
    二分浮点数二分模板boolcheck(doublex){/*...*/}//检查x是否满足某种特性doublebsearch_3(doublel,doubler){constdoubleeps=1e-6;while(r-l>eps){doublemid=(l+r)/2;if(check(mid))r=mid;else......