首页 > 其他分享 >二分图

二分图

时间:2024-07-26 21:28:59浏览次数:6  
标签:二分 匹配 增广 int MAXN 顶点

二分图

定义:

二分图是一种特殊的图,顶点被分为左右两部分,且两部分内没有连边。

  • 来源于oiwiki

因为此图可以被分为两个集合,所以每条边链接的两个顶点都可以看作一个黑色,一个白色(如上图)。

判定是否为二分图

  • 需要判断是否能分为两个集合

可以用染色法。

用深搜去遍历图,给每个顶点赋上颜色(黑白),若出现自相矛盾的情况(一条边俩顶点颜色一致),则不是。

二分图最大匹配

给定一个二分图 $G$,分左右两部分,各部分之间的点没有边连接,要求选出一些边,使得这些边没有公共顶点,且边的数量最大。

  • 匈牙利算法(增广路算法)

利用贪心的思想,枚举左边的每个点,看看能否匹配到右边的点。

1、设 $s\in \emptyset$,即所有边都为未匹配边。

2、寻找增广路,把路径上的所有边匹配状态取反,取到一个更大的匹配 $S'$。

3、重复第 $2$ 步,直到图中不存在增广路。

寻找增广路

匈牙利算法依次尝试给每一个左边节点 $x$ 匹配一个右边节点 $y$,若匹配成功,则需要满足以下条件之一:

1、$y$ 本来就是未匹配点。此时 $(x,y)$ 本身就是非匹配边,自己构成一条长度为 $1$ 的增广路。

2、$y$ 已与左部节点 $x'$ 配对,但从 $x'$ 可以再次找到一个右边节点 $y'$ 配对,则 $(x,y,x',y')$ 构成一条增广路。

P3386 【模板】二分图最大匹配

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,e;
int u,v;
const int MAXN=1005,MAXE=1e4+5;
int head[MAXN],cnt_edge;
bool g[MAXN][MAXN];
int ans;
bool vis[MAXN];
int match[MAXN];
bool dfs(int now)
{
	for(int i=1;i<=m;i++)
	{
		if(!vis[i]&&g[now][i])
		{
			vis[i]=true;
			if(!match[i]||dfs(match[i]))
			{
				match[i]=now;
				return true;
			}
		}
	}
	return false;
}
int main(){
	scanf("%d%d%d",&n,&m,&e);
	for(int i=1;i<=e;i++)
	{
		scanf("%d%d",&u,&v);
		g[u][v]=true;
	}
	for(int i=1;i<=n;i++)
	{
		memset(vis,false,sizeof(vis));
		if(dfs(i)) ans++;
	}
	printf("%d\n",ans);
	return 0;
}

标签:二分,匹配,增广,int,MAXN,顶点
From: https://www.cnblogs.com/Atserckcn/p/18326281

相关文章

  • 牛可乐与魔法封印----(二分)
     题目描述牛可乐得到了一个长度为n且非严格单调递增的序列 a,然而这个序列被q层魔法封印了,其中第i 层封印的问题包含两个整数xi,yi(xi≤yi),牛可乐必须正确回答序列中大于等于xi且小于等于yi​的数字个数才能够解开该层封印。牛可乐觉得这个问题太难了,于是他想请......
  • 二分模块的相关性
    在寻找保持列表排序而不考虑插入和删除的方法时,我遇到了bisect和sortedcontainers模块。bisect的insort功能是O(n)因为它结合了bisect_leftO(logn)和|||然而,一个等效的操作insertO(n)defins......
  • 二分答案解题技巧
    二分答案有一个很显著的特征:一定存在一个临界值,单调性只是临界值的一种,而不是全部。临界值,就是寻找第一个/最后一个满足要求的值,这又分别对应着两个完全不同的二分模板,这里做题时推荐使用“第一个满足要求的值”,即对应着STL中的upper_bound,手写板对应着这篇文章里讲的模板......
  • 二分查找(数组的练习)
    一、什么是二分查找    二分查找(又叫折半查找)是一种查找算法,它能使查找的速度更快,但要求查找的序列必须有序。        如果我们按顺序在一个序列中查找一个数,当这个数在靠前的位置,查找的速度还好;那么当这个数在很靠后的位置呢?甚至是一个很长的数组,要查找......
  • 二分图
    概念二分图是图论中的一个重要概念,指的是一个图的顶点集可以被分为两个互不相交的子集,并且图中的每条边都连接两个不同子集中的顶点。换句话说,如果一个图是二分图,那么可以将图中的所有顶点分为两组,使得每条边的两个端点分别属于不同的组。二分图当且仅当图中不含奇数环。判断......
  • 二分查找算法基础
    一.二分查找二分查找,又叫“折中查找”,其通过问题的性质,每次将问题规模缩小一半,对应的时间复杂度为O(logN)。二分查找不仅能用作数组元素的查找,还可用于单调函数的求解。对于二分查找算法,它包含head(头指针),tail(尾指针), mid三个变量,这里的头尾指针其实并不是指针,一般为整型,表......
  • 代码随想录算法训练营第一天leetcode704二分查找27移除元素
    leetcode704,这是leetcode提交四次后通过的结果:classSolution{  publicintsearch(int[]nums,inttarget){    if(nums.length==1&&nums[0]==target)      return 0;    if(nums.length==2)      if(nums[0]==target)......
  • 01-复杂度3 二分查找 陈越、何钦铭数据结构
    题目可以满分通过的答案:`PositionBinarySearch(ListL,ElementTypeX){Positionleft=1;Positionright=L->Last;while(left<=right){Positioncenter=(left+right)/2;if(L->Data[center]>X){right=center-1;}elseif(L->Data......
  • 二分查找 | 绝对差值和
    题目:1818.绝对差值和给你两个正整数数组nums1和nums2,数组的长度都是n。数组nums1和nums2的绝对差值和定义为所有|nums1[i]-nums2[i]|(0<=i<n)的总和(下标从0开始)。你可以选用nums1中的任意一个元素来替换nums1中的至多一个元素,以最小化绝......
  • 二分查找
    二分查找是很经典的算法了,写的时候虽然写对了,后面看了文章才知道细节还是蛮多的。像target所在的区间,有[left,right]和[left,right)两种写法,会极大的影响边界处理条件。实质就在于我们需要在定义的区间内对target进行搜索,而不能有任何遗漏。后面的处理要和前面的区间范围配合。逻......