二分图相关问题
二分图及其应用

求最大匹配举例
①取一个初始匹配M={Bb,Cc,Dd}. ②用标记法从点A开始求得一条增广路:=(AcCe)(左图). ③用调整匹配M:将中属于M的边删去并将其中不属于M的
其它边添加到M中得到比M多一边的新匹配M’(如右图 示). ④因对M’用标记法只能从E或F开始,但都不能求出M’的 任何增广路,故判定M’是一个最大匹配.
13
匈牙利算法:
初始时最大匹配为空 for 二分图左半边的每个点i do 从点i出发寻找增广路径。如果找到,则把它取反
(即增加了总了匹配数)
如果二分图的左半边一共有n个点,那么最多找n 条增广路径。如果图中共有m条边,那么每找一 条增广路径(DFS或BFS)时最多把所有边遍历一 遍,所花时间也就是m。所以总的时间大概就是O (n * m)。
6
例2:工作分配问题
问题 某教研室有4位教师:A,B,C,D. A能教课程5;B能教 1,2;C能教1,4;D能教课程3.能否适当分配他们的任务,使4 位教师担任4门不同课并且不发生安排教师教他不能教的 课的情况?
此问题可归结为二分图的数学模型: G={A,B,C,D},E,{1,2,3,4,5},(X,y)E,如果X能教y.一 个满足要求的工作分配正是一个含有4条边的一个最大匹 配.
for(i=0;i<n;i++) { if(mark1[i]) { if(!v[i].empty()){ memset(mark2,true,sizeof(mark2)); for(j=0;j<v[i].size();j++) { point = v[i][j]; if(!mark2[point]) continue; mark2[point] = false; if(list[point] == -1 || dfs(point)) { list[point] = i; num++; break; } } } mark1[i] = false; } } if(flog || list[0] != -1) cout << num-1 << endl; else cout << num << endl; } int main() { int i,j,s,d; while(cin>>n) { if(n == 0)break; v.clear(); v.resize(n); cin >> m >> edge; for(i=0;i<edge;i++) { cin >> j >> s >> d; v[s].push_back(d); } Solve(); } return 0; }
二分图最大匹配问题贪心算法

二分图的最大匹配
e.g.飞行员分成两部分,一部分是正驾驶员,一部分是副驾驶员。显然,如何搭配正副驾驶员才能使出航飞机最多的问题可以归结为一个二分图上的最大匹配问题。
常用算法
网络流算法(编程复杂,小题大做) 匈牙利算法(理解困难,实现简单) 以上这些我都不会怎么办?
二分图的基本概念
二分图是一类特殊的图结构 二分图是这样一种图:G的顶点集合V分成两部分X与Y,G中每条边的两个端点一定是一个属于X而另一个属于Y。
匹配的基本概念
设G=[V,E]是一个无向图,M属于E是G的若干条边的集合,如果M中的任意两条边都没有公共的端点,就称M是一个匹配。
最大匹配的基本概念
注意
以上所述的贪心算法仅适用于二分图的最大匹配问题,最佳匹配问题是不适用的。 本人尚未见到有人能够对此算法给出严格的证明,但是网上确实也有不少人有用此算法过全点的经历。 总之,请各位慎重使用! (:以下附例题的主程序的代码
主程序代码
贪心算法
下面,我们引进一种能够完美解排
一个重要的会议由A公司的M位代表和B公司的N位代表参加(M,N≤1000,代表用1,2,……,M和1,2,……,N表示)。他们被预先分成K(K≤60000)组进行谈判。每组两个人分别来自A公司和B公司。每个参加会议的代表都至少参加了一组谈判。会议为每一个代表都准备了一个房间。技术人员将会在一些房间之间连上直通电话,一个代表至少要和他的一个谈判对手直接联络。连接一个直通电话的价格是常数。技术人员要用尽量少的花费满足会议的要求。
贪心算法
接着,我们将u,v两点都进行删除操作。 (当u的出边所对的点都已被访问,那么就找不到满足条件的v,因此只对u进行操作) 所谓删除操作,在这里,删除s,其实就是将s的所有出边所对的点t的出度都减一。 (因为要删除点s,即(s,t)也被删除,即(t,s)也要被删除,所以t的出度要减一)
算法合集之《浅析二分图匹配在信息学竞赛中的应用》

05 二分图匹配的实践案例
最大二分匹配问题的应用案例
最大二分匹配问题
在二分图中寻找最大的匹配数,使得每条边只被匹配一次。
应用案例
社交网络中的好友推荐。通过最大二分匹配算法,可以找到社 交网络中最多共同好友的两个人,从而推荐他们成为好友。
算法实现
使用匈牙利算法或Kuhn-Munkres算法求解最大二分匹配 问题。
剪枝策略
剪枝条件
在匹配过程中,根据一定的条件判断是否可以剪去当前分支 ,以减少不必要的计算量。
剪枝操作
在匹配过程中,根据剪枝条件进行剪枝操作,避免匹配到不 可能的解。
并查集策略
并查集初始化
在处理二分图匹配问题之前,将图中 的节点按照所属类别进行初始化。
并查集合并操作
在匹配过程中,根据并查集的合并操 作快速判断一条边是否存在于图中, 提高匹配效率。
算法实现
使用匈牙利算法、Kuhn-Munkres算法等经典算法,通过寻找 增广路径和增广回溯的方式求解最大二分匹配。
应用场景
在信息学竞赛中,最大二分匹配问题常用于解决诸如排班、分配 等问题,具有广泛的实际应用价值。
二分图的顶点覆盖问题
二分图的顶点覆盖问题
01
在二分图中寻找最小的顶点集合,使得该集合覆盖所
算法合集之《浅析二分图匹 配在信息学竞赛中的应用》
目录
Contents
• 二分图匹配概述 • 二分图匹配的算法 • 二分图匹配在信息学竞赛中的应用 • 二分图匹配的优化策略 • 二分图匹配的实践案例
01 二分图匹配概述
二分图匹配的定义
二分图匹配是指将一个二分图中的顶 点划分为两个不相交的子集,使得每 个子集中的顶点之间没有边相连,而 两个子集之间通过边相连。
地图的运用--地球公转-二分二至-习题

1、读“地球公转示意图”,回答下列问题:(1)、地球围绕着 的旋转运动叫公转运动;公转周期是__ ____;公转方向是。
并在图乙中的公转轨道上,用箭头画出公转方向。
(2)、图甲中,A 点坐标( , ),位于 半球(东/西),位于 半球(南/北),位于 纬度(高/中/低);B 点坐标( , ),位于五带中的 带。
(3)、在A 、B 两点中,先看到日出的是 点(A/B ),先看到日落的是 点(A/B )。
(4)、A 点位于B 点的 方向,B 点位于A 点的 方向。
(5)、图乙中,①节气 ,日期 ;②节气 ,日期 ;③节气 ,日期 ;④节气 ,日期 。
(6)、考查直射点:①直射点 ,②直射点 ,③直射点 ,④直射点 。
(7)、考查直射点变化:观察图乙和图丙,图乙中地球由②到③属于图丙中的 段(a/b/c/d ),③到④是 段(a/b/c/d ),④到①是 段(a/b/c/d ),①到②是 段(a/b/c/d )。
(8)、考查北半球获得热量:②这一天,北半球获得太阳光热量最___ ___(多或少或一样多),④这一天,北半球获得太阳光热量最___ ___(多或少或一样多),③①这一天,北半球获得太阳光热量最___ ___(多或少或一样多)。
(9)、考查昼夜长短情况:(北半球)②这一天昼夜情况 ,④昼夜情况 ,①昼夜情况 ,③昼夜情况 。
(10)、考查昼夜长短变化:在图丙a 、b 、c 、d 四段中,昼变短,夜变长的是 ,昼变长,夜变短的是 ;昼长夜短的是 ,昼短夜长的是 。
(11)、灵活运用:国庆节的时候,昼夜情况是 ,太阳直射点在图丙中a 、b 、c 、d 段的_____段。
(12)、当太阳直射点处在图2中的a 段时,此时段北极圈内极昼范围的变化趋势是( )A .全部到无B .无到全部C .一半到全部D .全部到一半2、读下图,回答下列问题:(1)、在北极附近的弧线和赤道上补绘箭头,以正确表示地球自转的方向。
二分图相关问题

X X S X X
X X X X
X代表攻击范围,S代表骑 士
分析
对棋盘染色,设方格的坐标为(x,y),x和y同奇 偶的方格对应X集合,不同奇偶的对应Y集合。 由于骑士沿着“日”字形路线攻击,所以每个 攻击肯定是处于X集合和Y集合之间,而不可 能在两个集合内部。 显然,转化后变为求二分图的最大独立集
匈牙利算法
简要说明:find函数用于判断从k点开始是否能 够找到一条交错路。对于每个可以与k匹配的 顶点j,假如它未被匹配,交错路就已经找到; 假如j已与某顶点x匹配,那么只需调用find(x) 来求证x是否可以与其它顶点匹配,如果返回 true的话,仍可以使j与k匹配;这就是一次 DFS。每次DFS时,要标记访问到的顶点 (cover[j]=true),以防死循环和重复计算。
例题分析
Hanoi Tower Troubles Again! (OIBH Contest)
ZOJ 1239 题目大意:给定柱子数N,按编号从小到大放球, 要求:如果该球不在最底数,则该球和它下面一个 球的编号之和必须为完全平方数。 问对于给定的N,最多能放多少球上去。 N<=50
例题分析
分析
铺放方法
1.2. .333 444. ..2.
Sample Output 4
分析
最小覆盖是覆盖所有的边,因此泥地对应边 建图方式类似于皇家卫士,也是利用行连通块 和列连通块做点,单位泥地对应二分图中的边 要求放最少的板覆盖全部的泥地,转化为求最 小覆盖
二分图最大独立集
图的独立集:寻找一个点集,其中任意两点在 图中无对应边 一般图的最大独立集是NP完全问题 二分图的最大独立集=图的点数-最大匹配数
二分图最小覆盖
图的覆盖:寻找一个点集,使得图中每一条边 至少有一点在该点集中
数学建模-二分图匹配

解题思路:本题是一道典型的二分图最大匹配 题。采用匈牙利算法。本题的构图是这样的, 左右两边的x和y,分别是x学生,y课程。那么 已知哪些学生可以学哪些课,也就是在x的点 和 y的点之间首先连上线。求xy的最大匹配。如果 有P个学生做了课代表,那么就是P门课程都有 课代表了。
例题1 Courses(hdu1006)
X学生
1 2 3
Y课程
1 2 3
样例 3
(1)建图
3 3 1 2 3 2 1 2 1 1
例题1 Courses(hdu1006)
X学生
1 2 3
Y课程
1 2 3
X学生
1 2 3
Y课程
1 2 3 连接 x1-y1 x2-y2 得到此 匹配, 匹配数 为2.
(1)建图
(2)
例题1 Courses(hdu1006)
(5)
(4)
例题1 Courses(hdu1006)
X学生
1
2 3
Y课程
1
2 3 1 2 3 1 2 3
1
2 3
1
2 3
(1)
1 2 1 2 1 2
(2)
1 2
(3)
3
3
3
3
(4)
(5)
#include<iostream> int link[303][303]; int used[303],mathy[303]; using namespace std; int P,N; int find(int x) {//x学生可以匹配到某课程 么 //可以返回1,不可以返回0 … } int MMG() { //计算最大匹配数, 调用了find … } int main( ) {int x,y,i,j; int cases; scanf("%d",&cases);
二分图匹配(匈牙利算法)
KM算法
对于任意的G和M,可行顶标都是存在的: l(x) = maxw(x,y) l(y) = 0 欲求完全二分图的最佳匹配,只要用匈牙利算法求 其相等子图的完备匹配;问题是当标号之后的Gl无 完备匹配时怎么办?1957年(居然比匈牙利算法 早???),Kuhn和Munkras给出了一个解决该问 题的有效算法,用逐次修改可行顶标l(v)的办法使对 应的相等子图之最大匹配逐次增广,最后出现完备 匹配.
例题3 打猎 猎人要在n*n的格子里打鸟,他可以在某一行 中打一枪,这样此行中的所有鸟都被打掉, 也可以在某一列中打,这样此列中的所有鸟 都打掉.问至少打几枪,才能打光所有的鸟? 建图:二分图的X部为每一行,Y部为每一列, 如果(i,j)有一只鸟,那么连接X部的i与Y部的j. 该二分图的最大匹配数则是最少要打的枪数.
1 2 3 4 5
1 2 5 3 4
1
2
3
4
由于每条边表示一个空地,有冲 突的空地之间必有公共顶点,所 以问题转化为二部图的最大匹配 问题.
1 2Leabharlann 34例题1 Place the Robots(ZOJ) 小结
比较前面的两个模型:模型一过于简单,没有给问 题的求解带来任何便利;模型二则充分抓住了问题的内 在联系,巧妙地建立了二部图模型.为什么会产生这种 截然不同的结果呢?其一是由于对问题分析的角度不同: 模型一以空地为点,模型二以空地为边;其二是由于对 原型中要素的选取有差异:模型一对要素的选取不充分, 模型二则保留了原型中"棋盘"这个重要的性质.由此 可见,对要素的选取,是图论建模中至关重要的一步.
例题4 最小路径覆盖 一个不含圈的有向图G中,G的一个路径覆盖 是一个其结点不相交的路径集合P,图中的每 一个结点仅包含于P中的某一条路径.路径可 以从任意结点开始和结束,且长度也为任意 值,包括0.请你求任意一个不含圈的有向图 G的最小路径覆盖数. 理清一个关系:最小路径覆盖数=G的定点 数-最小路径覆盖中的边数
二分图匹配与网络流问题
B[j]:=true L[j]为0或者Find(L[j])为真 //L数组记录右边每点匹配的左边点
L[j]:=I ,find:=true,exit; //找到就退出,返回真
Find:=false; //没找到 End Function 主程序 For I:=1~N
Fillchar(B,0,sizeof(B)) If find(i) then inc(Ans);
d
10 5
e
后退到原路径中从源点能够到达的最远点
一次Dfs,多次增广!
3,增广
对于栈中节点(即增广轨),找出最小 可流量min 对增广轨上每条边的可流量减去min,每 条边的反向弧可流量增加min
小结
可以证明层次图中的层次严格单调递增 ,所以最多建N次 循环N次
BFS建立层次图O(M) 根据层次图用DFS找增广轨O(N*M) 增广,返回第一步O(N)
问题的求解目标是寻求图G的最大独立集,即求G的 独立数α (G)。一般图的α (G)是很难计算的。 独立集是原图点集的一个子集,其中任意两点之间 没有边。 显然这一模型不是属于一些特殊的图,给我们设计 算法带来很大的麻烦。
二分图最大匹配及常用建图方法
算法———艺术二分图匹配剖析很多人说,算法是一种艺术。
但是对于初学者的我,对算法认识不是很深刻,但偶尔也能感受到他强大的魅力与活力。
这让我追求算法的脚步不能停止。
下面我通过分析匈牙利算法以及常用建图方式,与大家一起欣赏算法的美。
匈牙利算法匈牙利算法是用来解决最大二分图匹配问题的,所谓二分图即“一组点集可以分为两部分,且每部分内各点互不相连,两部分的点之间可以有边”。
所谓最大二分图匹配即”对于二分图的所有边,寻找一个子集,这个子集满足两个条件,1:任意两条边都不依赖于同一个点。
2:让这个子集里的边在满足条件一的情况下尽量多。
首先可以想到的是,我们可以通过搜索,找出所有的这样的满足上面条件的边集,然后从所有的边集中选出边数最多的那个集合,但是我们可以感觉到这个算法的时间复杂度是边数的指数级函数,因此我们有必要寻找更加高效的方法。
目前比较有效的方法有匈牙利算法和通过添加汇点和源点的网络流算法,对于点的个数都在200 到300 之间的数据,我们是采取匈牙利算法的,因为匈牙利算法实现起来要比网络流简单些。
下面具体说说匈牙利算法:介绍匈牙利之前,先说说“增广轨”。
定义:若P是图G中一条连通两个未匹配顶点的路径,并且属最大匹配边集M的边和不属M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广轨定义总是抽象的下面通过图来理解它。
图中的线段(2->3, 3->1, 1->4)便是上面所说的p路径,我们假定边(1,3)是以匹配的边,(2,3)(1,4)是未匹配的边,则边(4,1)边(1,3)和边(3,2)在路径p上交替的出现啦,那么p就是相对于M的一条增广轨,这样我们就可以用边1,4 和边2,3来替换边1,3 那么以匹配的边集数量就可以加1,。
匈牙利算法就是同过不断的寻找增广轨实现的。
很明显如果二分图的两部分点分别为n 和m,那么最大匹配的数目应该小于等于MIN(n,m); 因此我们可以枚举任第一部分(的二部分也可以)里的每一个点,我们从每个点出发寻找增广轨,最后吧第一部分的点找完以后,就找到了最大匹配的数目,当然我们也可以通过记录找出这些边。
离散数学中的图的匹配和二分图
在离散数学中,图论是一门重要的理论基础课程,它研究的是由节点和边构成的图结构。
图的匹配和二分图是图论中的两个重要概念,它们在现实生活中有着广泛的应用。
首先,我们来介绍一下图的匹配。
图的匹配指的是在一个图中选取一些边,使得这些边彼此不相交,即任意两条边不共享同一个顶点。
图的匹配问题可以用最优化问题来描述,既需要满足匹配条件,还需要满足某种优化目标。
例如,在一个社交网络图中,选择一些用户与其他用户进行配对,使得两个不认识的用户不会被配对在一起,同时目标是使得配对用户的兴趣爱好相似度最大化。
在这个问题中,边表示用户之间是否认识,而边的权值表示兴趣爱好的相似度。
其次,我们来介绍一下二分图。
二分图是一种特殊的图结构,它可以被划分为两个独立的顶点集合,使得同一个顶点集合内的顶点之间没有边相连。
换句话说,二分图中不存在奇圈。
二分图的一个典型例子是婚姻匹配问题。
假设有n个男性和n个女性,他们之间有多种可能的配对方式,但是每个人只能与另一个不同性别的人结婚。
这时,我们可以用一个二分图来表示这个问题,其中男性和女性分别作为两个顶点集合,边表示可能的配对。
然后,我们可以使用图的匹配算法来找到一个最佳匹配方案。
图的匹配和二分图在离散数学中有着重要的研究价值和应用价值。
首先,图的匹配可以用于解决资源分配问题。
例如,在一个工厂中,有m个任务需要分配给n个员工进行处理,每个员工对某些任务有一定的能力要求,而每个任务也需要一定的时间完成。
这时,我们可以将员工和任务分别作为两个顶点集合,边的权值表示员工对任务的能力是否满足要求和任务完成时间。
然后,我们可以使用图的匹配算法来找到一个最佳的任务分配方案,使得员工的工作量最小。
其次,二分图可以用于解决社交网络分析问题。
如今,社交网络已经成为人们日常生活中重要的一部分,人们之间通过社交网络平台进行交流和连接。
我们可以使用二分图来表示社交网络的结构,其中一个顶点集合表示用户,另一个顶点集合表示用户之间的好友关系,边的权值表示用户之间的相似性度量。