首页 > 其他分享 >二分图

二分图

时间:2024-05-22 22:41:26浏览次数:16  
标签:二分 遍历 匹配 算法 左侧 match

二分图的概念:

  • 如果将一个无向图的结点染成黑色或白色,并且可以满足任意相同颜色的两点之间没有边,这个无向图就是二分图。

一个图是否为二分图,一般用染色法判断。用 \(0,1\) 表示顶点的颜色。将任意一个顶点任意染色,然后遍历图,如果遇到没染色的点,就染成与这个点相反的颜色;否则判断是否与这个点颜色不同,如果颜色相同则不为二分图。

我们将一种颜色的点放到左侧,其他点放到右侧。这样所有边都连接异侧的点。

二分图匹配问题

二分图匹配:

在所有边中选择一些,满足每个点最多连一条边,这个边集即为一个匹配。

二分图最大匹配

在所有匹配中,边数最多的即为最大匹配。

求二分图最大匹配一般有两种算法:最大流、匈牙利算法。下面分别讲解。

1. 最大流

建一个源点,向所有左侧的点连一条流量为 \(1\) 的边,代表点只能连一条边;建一个汇点,所有右侧的点向汇点连一条流量为 \(1\) 的边。中间的边由左边连向右边,流量为 \(1\)。这个图的最大流即为最大匹配边数。

共有 \(N\) 个点,\(M\) 条边,求解最大流,时间复杂度上界为 \(\mathcal{O}(N^2M)\),但实际上远远达不到上界。

例题 洛谷-P3386/HDU-2063

这里用 ISAP 算法求最大流。下面给出代码:

代码

2. 匈牙利算法

在学习该算法时,一定要注意各个定义是左边的点还是右边的点。

设 \(match_i\) 表示右侧的点 \(i\) 当前所匹配到左侧的点。

遍历所有左侧的点 \(u\),然后遍历右侧的点 \(v\),如果满足一下两个条件之间的一个,就将 \(match_v\) 改为 \(u\),并让匹配数加 \(1\)。

  • \(v\) 还没有匹配左侧的点

  • 成功为 \(v\) 找到了一个新的匹配

设 \(dfs(u)\) 表示为左侧点 \(u\) 找匹配,如果成功返回 \(1\),否则返回 \(0\)。

每次搜索时,我们再设一个 \(vs\) 数组,\(vs_i\) 表示右侧点 \(i\) 是否被遍历过,保证不重复遍历。

接下来遍历 \(u\) 连接到的所有点 \(v\),如果 \(match_v=0\) 或者 \(dfs(match_v)=1\),则将 \(match_v\) 改为 \(u\) 并返回 \(1\)。如果没有任何点能够匹配,返回 \(0\)。

这样左侧每个点匹配时,最多会把所有边遍历一遍,因此时间复杂度为 \(\mathcal{O}(NM)\)。

代码

两种算法的比较

以洛谷数据为参照,下面是两种算法的对比:

算法 运行时间 运行空间 代码长度 输出可行解
最大流 54ms 1644kB 较长 较难
匈牙利算法 85ms 1128kB 较短 简便

读者可根据情况自行选择算法。

标签:二分,遍历,匹配,算法,左侧,match
From: https://www.cnblogs.com/lrxmg139/p/18207297

相关文章

  • 完全二分图生成树个数
    首先矩阵树定理,得到一个行列式,大概形如:\[\begin{bmatrix}m&&&&-1&-1&-1\\&m&&&-1&-1&-1\\&&m&&-1&-1&-1\\&&&m......
  • 二分
    时间复杂度连续自然数和对一个给定的正整数$M$,求出所有的连续的正整数段(每一段至少有两个数),这些连续的自然数段中的全部数之和为$M$。例子:$1998+1999+2000+2001+2002=10000$,所以从$1998$到$2002$的一个自然数段为$M=10000$的一个解。题目看到是连续数字相加,就可以用......
  • 二分答案 洛谷P3853路标设置
    这个题思路和洛谷P2440有点像,建议先看P2440这个题,较简单。[TJOI2007]路标设置题目背景B市和T市之间有一条长长的高速公路,这条公路的某些地方设有路标,但是大家都感觉路标设得太少了,相邻两个路标之间往往隔着相当长的一段距离。为了便于研究这个问题,我们把公路上相邻路标的最......
  • 二分答案 洛谷2440木材加工
    二分答案题目详见洛谷P2440木材加工分享一下自己新学习的二分答案的方法,开始可能有点奇怪为啥这样能做,但其实思路很简单。起始思路题目要求我们求最大的分解长度,所以我(们)最开始想的肯定是从大到小(求最大值)枚举答案,看看是否满足,满足不了就加1。但这样暴力肯定是会超时的,那我们......
  • 代码随想录算法训练营第一天|704,34,35(二分查找),27(双指针)
    二分查找1.使用条件:数组,升序,值不唯一。2.时间复杂度O(logn)可分为左闭右闭,左闭右开两种区间类型来求解。左闭右闭:left=0,right=nums.Length-1,while(left<=right),right=middle-1.左闭右开:left=0,right=nums.Length,while(left<right),right=middle.......
  • 算法随想录打卡第一天|704. 二分查找、27. 移除元素
    704.二分查找-力扣(LeetCode)自己的解法是这样的,超出了时间限制,现在觉得应该是在mid的计算中出了问题。然后在mid的转换中没有right减去1或者left加上1。这两点的问题。自己很习惯的方式是左闭合加上右闭合。可以省去很多对于临界值忘记考虑的麻烦。超时代码贴出:publicin......
  • 二分图
    二分图定义:一张图的\(N\)个节点可以分为\(A,B\)两个非空集合,满足同一个集合中的任意两个点没有连边。集合\(A,B\)分别叫做二分图的左部和右部,如图所示:二分图的判定交替染色,只有相邻的点颜色不一样时才可能是二分图,定理:二分图一定不存在奇环(易证)。判定:搜索\(dfs\)或......
  • 二分图的最大匹配(匈牙利算法)代码
    二分图的最大匹配代码#include<bits/stdc++.h>usingnamespacestd;constintN=505,M=100005;inth[N],e[M],ne[M],idx;intmatch[N];boolst[N];intn1,n2,m;voidadd(inta,intb){e[idx]=b;//e[idx]存放的是第idx条边的终点ne[idx]=h......
  • 二分查找
    输入 n 个不超过 10九次方 的单调不减的(就是后面的数字不小于前面的数字)非负整数 ......
  • luoguP1163-二分
    银行贷款题目链接:https://www.luogu.com.cn/problem/P1163本题思路:orz公式数学公式给出n,m,k,求贷款者向银行支付的利率p,使得:$\sum_{i=1}^{k}m*[\frac{1}{1+p}]^{i}$,通过化简(根据等比数列的求和公式)我们有:$m\frac{1-\left(\frac{1}{1+p}\right)^k}{1-\frac{......