二分图相关问题
二分图及其应用
求最大匹配举例
①取一个初始匹配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个员工进行处理,每个员工对某些任务有一定的能力要求,而每个任务也需要一定的时间完成。
这时,我们可以将员工和任务分别作为两个顶点集合,边的权值表示员工对任务的能力是否满足要求和任务完成时间。
然后,我们可以使用图的匹配算法来找到一个最佳的任务分配方案,使得员工的工作量最小。
其次,二分图可以用于解决社交网络分析问题。
如今,社交网络已经成为人们日常生活中重要的一部分,人们之间通过社交网络平台进行交流和连接。
我们可以使用二分图来表示社交网络的结构,其中一个顶点集合表示用户,另一个顶点集合表示用户之间的好友关系,边的权值表示用户之间的相似性度量。
判断图是否为二分图
图二的分割
1 4
8
7 6
2 3
5
图三
1 3 2 4
7 6 5
图四
1
3
7 5
2
4
6
4 7 3 2
图五的分割
6.结论
经测试,得到以下结果: 1. 取若干的图进行测试,可以人工染色得出是否为二分图,再跟程序运行结果对比, 可以验证程序的正确性,可以发现本程序是正确的。 2. 其实进一步我们可以发现只要图中有奇数个节点组成的环,那么就不会是二分图。
2.解决方案
用广度优先搜索算法对给定的图进行遍历,对相邻节点进行黑白着色(白色染 0,黑色 为 1) ,如果最后程序结束时,相邻节点的颜色都不同,则是二分图,且同一颜色的节点属 于同一集合,只有黑白二色,故原来的节点被分成两个集合 A、B, (A,B)即为原来图的一 个分割。若着色过程中出现矛盾,即原本已经染为白色,下次搜索到时却应该染成黑色,或 者相反情况,此时则不是二分图。 可以证明此种方法可以版定二分图,并且给出一个分割。反证,因为如果(A,B)不是二 分图的一个分割,则存在同一个集合中的两个元素,这两个顶点之间存在边连接,那么根据 算法这两个顶点颜色不同,然而另一方面,这两个顶点在一个集合中,颜色必然相同,由此 得出矛盾。所以假设不成立,所以这是个二分图,并且(A,B)是此二分图的一个分割。 效率分析:计算复杂度就是广度优先搜索算法(BFS)的复杂度,为 O(V+E) 。
5.测试结果
输入各种图,运行程序判断是否为二分图,通过运行程序,可以得到各种图是否
为二分图,见表一。如果是二分图,可以得到一个分割,见二分图的下方。
图 是否二分图 图1 是 图2 是 图3 否 图4 否 图5 是
匈牙利算法 描述
匈牙利算法描述匈牙利算法是图论中一种用于解决二分图匹配问题的算法。
它首次由匈牙利数学家Denzel匈牙利在1955年发表,因而得名。
匈牙利算法属于图匹配算法的范畴,在实际应用中有着很强的效率和准确性。
本文将介绍匈牙利算法的原理、实现方法和应用领域等相关内容。
一、匈牙利算法原理匈牙利算法是解决二分图最大匹配问题的经典算法之一。
在二分图中,匈牙利算法的目标是寻找图中的最大匹配,即尽可能多地找到满足匹配条件的边,也就是找到尽可能多的配对节点。
在匈牙利算法中,主要使用了增广路的概念,通过不断地寻找增广路,来不断地扩展匹配。
具体而言,匈牙利算法的核心思想是利用增广路径寻找最大匹配。
在每一次匹配的过程中,首先选择一个未匹配的节点,然后通过交替路径寻找增广路径,直到无法找到增广路径为止。
当无法找到增广路径时,说明找到了最大匹配。
增广路径指的是一条由未匹配的节点和匹配节点交替构成的路径,其中未匹配节点为起点和终点。
通过不断地寻找增广路径,可以逐步扩展匹配。
在匈牙利算法中,为了记录节点的匹配状态和寻找增广路径,通常使用匈牙利标号和匈牙利交错路的方式。
匈牙利标号是为每个节点标记一个代表节点匹配状态的值,而匈牙利交错路则是一种用于寻找增广路径的方法。
借助这些工具,匈牙利算法可以高效地解决最大匹配问题。
二、匈牙利算法实现方法匈牙利算法的实现方法较为复杂,需要结合图论和图匹配的相关知识。
在实际应用中,匈牙利算法通常通过编程实现,以解决特定的二分图匹配问题。
下面简要介绍匈牙利算法的一般实现方法。
1. 初始化匈牙利标号:首先对图中的所有未匹配节点进行初始化标号,即给它们赋予一个初始的匈牙利标号。
2. 寻找增广路径:选择一个未匹配的节点作为起点,通过交替路径和增广路的方法寻找增广路径。
在寻找增广路径的过程中,要根据节点的匈牙利标号来选择下一个节点,从而找到满足匹配条件的路径。
3. 匹配节点:如果成功找到一条增广路径,就可以将路径中的节点进行匹配,即将原来未匹配的节点与匹配节点进行匹配。
基于二分图完美匹配算法变换序列问题论文
基于二分图完美匹配算法的变换序列问题图论模型起源于“哥尼斯堡的七桥问题”,是指对一些客观事物进行抽象、化简,并用图来描述事物特征及内在联系的过程。
在建立图论模型的过程中,和几何模型、运筹学模型一样,也需要用到集合、映射、函数等基本的数学概念和工具。
如何建立问题的图论模型并没有通用的准则。
在复杂的实际问题中,有时我们会感到难以建立适当的模型,这些都需要我们有丰富的经验,灵活的思维以及良好的创造力。
一、变换序列问题描述对于0,1,…,n-1的n个整数,给定一个距离序列d0,d1,…,dn-1,定义一个变换序列t0,t1,…,tn-1使得每个i,ti的环上距离等于di 。
一个合法的变换序列应是0,1,…,n-1的一个排列,任务是要求出字典序最小的那个变换序列。
二、图论模型建立问题抽象成图论模型:建立一个二分图,x集合每个顶点代表0,1,…,n-1的n个整数,y集合每个顶点为对应的n个整数。
x集合的第i个顶点向其环上距离为di的y集合中的两个顶点连一条边。
三、图的有关理论二分图:设x,y都是非空有限顶点集,且x∩y = ,称g=(x,y,e)为二分图。
正则图:定义2若二分图g=(x,y,e)的每一个顶点的都与k条边相连,则称g为k阶正则图。
匹配:图g(v,e)中若干互不相邻的边组成的集合称为图g的一个匹配。
最大匹配:给定一个二分图g(v,e),在g的一个子图m中,m 的边集中的任意两条边都不依附于同一个顶点,则称m是一个匹配。
选择这样的边数最大的子集称为图的最大匹配问题。
完全匹配(或称完备匹配):如果一个匹配中,图中的每个顶点都和图中某条边相关联,则称此匹配为完全匹配,也称作完备匹配。
完美匹配:若一个匹配既是一个二分图g=(x,y,e)中x到y 的完全匹配,又是y到x的完全匹配,则称这个匹配是二分图g=(x,y,e)的完美匹配。
(此时|x|=|y|)增广路的定义(也称增广轨或交错轨):若p是图g中一条连通两个未匹配顶点的路径,并且属m的边和不属m的边(即已匹配和待匹配的边)在p上交替出现,则称p为相对于m的一条增广路径。
二分图的匹配
第九章二分图中的匹配三个典型问题:(1)在一个有禁止位置的m×n棋盘上,能放置非攻击型车的最多个数是多少?(2)在一个有禁止位置的m×n棋盘上,能放置多米诺牌覆盖的最多个数是多少?(3)一个公司有n个工作空缺,需要有一定技能的人填补,同时有m个人申请这些项工作,每人能胜任n项工作中的若干项,问最多有多少项工作能找到合适的人选?9.1 一般的问题描述定义1:令X={x1, x2, …,x m}, Y={y1,y2, …,y n},且X∩Y=Ф,而△是序偶e=(x,y)的集合,其中x ∈X,y∈Y,那么三元组G=(X,△,Y)称作二分图。
定义2:令G=(X,△,Y)是一个二分图,边集△的子集M,若M中没有两条边存在公共点,称M是二分图G的一个匹配。
定义3:设G是一个二分图,定义ρ(G)={∣M∣:M是G的一个匹配}为二分图G的最大匹配边数。
9.2 匹配定义1:G=(X,△,Y),X={x1, x2, …,x m}, Y={y1,y2, …,y n},满足∣M*∣=ρ(G)的匹配M*称为二分图G的最大匹配。
一般M*不唯一,且∣M*∣=ρ(G)≤min{m,n}。
寻找M*的困难点:(1)若已知ρ(G),那么遍历所有可能的匹配会找到M*,但搜索量巨大;(2)一般ρ(G)并不事先知道,要找到M*,并求出ρ(G)=∣M*∣难度更大。
定义2:令u和v是二分图G=(X,△,Y)的任意两个顶点,连接u和v的互异顶点序列:γ:u=u0, u1, u2, …, u p-1, u p=v使得任意两个相邻顶点有一条边连接,即:{ u0, u1},{ u1, u2},…, { u p-1, u p}∈△,那么称序列γ为二分图G的一个链。
链长等于序列的边数p,若u=v, 链γ也叫圈。
定义3:令M为二分图G=(X,△,Y)中的一个匹配,令M是M的补集,即G的不属于M的边集合,M∪M=△。
令u和v是顶点,且u和v一个是左顶点(即属于X),一个是右顶点(即属于Y),若连接u和v的链满足下列性质:(1)γ的第一、三、五、、、边属于M;(2)γ的第二、四、六、、、边属于M;(3)u和v都不与M的边相连。
二分图及匹配算法
Chapter 3
二分图最佳匹配
-二分图最佳匹配-
定义:图G中权值和最大的完全匹配。
Kuhn-Munkras算法:该算法是通过给每个顶点一个标号(叫做顶标) 来把求最大权匹配的问题转化为求完备匹配的问题的。设顶点Xi的顶标 为A[ i ],顶点Yj的顶标为B[ j ],顶点Xi与Yj之间的边权为w[i,j]。在算法 执行过程中的任一时刻,对于任一条边(i,j),A[ i ]+B[j]>=w[i,j]始终成立。 KM算法的正确性基于以下定理: 若由二分图中所有满足A[ i ]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等 子图)有完备匹配,那么这个完备匹配就是二分图的最大权匹配。 KM算法流程: (1)初始化可行顶标的值; (2)用匈牙利算法寻找完备匹配; 这样做是O(n^4)的
-稳定婚姻问题-
Байду номын сангаас
求婚拒绝算法(Gale-Shapley算法/延迟认可算法): 先对所有男生进行单身标记,称其为单身狗男。当存在单身狗男时,进行 以下操作:
①选择一位单身狗男在所有尚未拒绝她的女生中选择一位被他排名最优先 的女神;
②女神将正在追求她的单身狗男与其现任进行比较,选择其中排名优先的 男生作为其男友,即若单身狗男优于现任,则现任被抛弃为前任;否则保 留其男友,拒绝单身狗男。 ③若某男生被其女友抛弃,则重新变成单身狗男,至①重复。
Chapter 5
稳定婚姻问题
-稳定婚姻问题-
你们班上有n位男生和n位女生,每个人对异性都有一个排序,表示对他们 的爱恋程度。现在你的任务是使他们凑成CP,使他们的爱情坚不可摧! 满足一下条件的爱情不是坚不可摧的: 男生u和女生v不是CP,但他们爱恋对方的程度都大于爱恋现任 的程度。 因为这样男生u和女生v会抛下已经是CP的那个她/他,另外组成一对。于 是乎多出了两位前任,这样就会让人再也无法相信爱情了! 怎么能避免悲剧的发生呢?
vcz定理问题回答
vcz定理VCZ定理是计算机科学中的一个重要定理,它是由三位计算机科学家Vazirani、Chazelle和Zachos共同提出的。
VCZ定理的全称是Vazirani-Chazelle-Zachos定理,它是关于图形问题的一个重要结论。
VCZ定理的主要内容是:对于任何一个图形问题,如果它可以在多项式时间内求解,那么它也可以在多项式时间内验证。
这个定理的意义在于,它告诉我们,如果一个问题可以在多项式时间内验证,那么我们就可以把它看作是一个“容易”的问题,因为我们可以很快地验证这个问题的答案是否正确。
VCZ定理的证明过程比较复杂,需要运用到一些高深的数学知识,比如线性代数、图论等等。
但是,我们可以通过一个简单的例子来理解VCZ定理的应用。
假设我们有一个图形问题,需要判断一个图形是否是二分图。
二分图是指一个图形可以被分成两个部分,每个部分内部的点之间没有边相连,而两个部分之间的点都有边相连。
如果我们想要判断一个图形是否是二分图,我们可以使用VCZ定理来验证。
首先,我们可以在多项式时间内验证一个图形是否是二分图。
具体方法是,我们可以把图形的所有点分成两个集合,然后检查每个点是否与它所在的集合内的点都没有边相连。
如果所有的点都符合这个条件,那么这个图形就是一个二分图。
其次,如果一个图形是二分图,那么我们也可以在多项式时间内求解它。
具体方法是,我们可以使用染色算法来判断一个图形是否是二分图。
染色算法的基本思想是,我们从一个点开始,把它染成一种颜色,然后把与它相邻的点染成另一种颜色,然后再把与这些点相邻的点染成第一种颜色,以此类推。
如果在染色的过程中,我们发现了两个相邻的点颜色相同,那么这个图形就不是二分图。
综上所述,VCZ定理在计算机科学中具有重要的意义,它告诉我们如何判断一个问题的难易程度,并且为我们提供了一种有效的解决问题的方法。
在实际应用中,我们可以根据VCZ定理的思想,设计出更加高效的算法,来解决各种图形问题。
【算法】二分图的判定
【算法】⼆分图的判定⼆分图的判定 给定⼀个具有n个顶点的图。
要给图上每个顶点染⾊,并且要使相邻的顶点颜⾊不同。
判断是否能最多⽤两种颜⾊进⾏染⾊。
题⽬保证没有重边和⾃环。
概念:把相邻顶点染成不同颜⾊的问题叫做图的着⾊问题。
对图进⾏染⾊所需要的最⼩颜⾊数称为最⼩着⾊度。
最⼩着⾊度为2的图称作⼆分图。
分析:如果只⽤两种颜⾊,那么确定⼀个顶点的颜⾊之后,和它相邻的顶点的颜⾊也就确定了。
因此,选择任意⼀个顶点出发,依次确定相邻顶点的颜⾊,就可以判断是否可以被2种颜⾊染⾊了。
这个问题⽤深度优先搜索可以简单实现。
#include <bits\stdc++.h>using namespace std;#define MAX_V 1000//输⼊vector<int> G[MAX_V]; //图int V; //顶点数int color[MAX_V]; //顶点的颜⾊(1 or -1)//顶点v,颜⾊cbool dfs(int v,int c){color[v] = c;//把当前顶点相邻的顶点扫⼀遍for(int i = 0;i < G[v].size(); i++){//如果相邻顶点已经被染成同⾊了,说明不是⼆分图if(color[G[v][i]] == c) return false;//如果相邻顶点没有被染⾊,染成-c,看相邻顶点是否满⾜要求if(color[G[v][i]] == 0 && !dfs(G[v][i],-c)) return false;}//如果都没问题,说明当前顶点能访问到的顶点可以形成⼆分图return true;}void solve(){//可能是不连通图,所以每个顶点都要dfs⼀次for(int i = 0;i < V; i++){if(color[i] == 0){//第⼀个点颜⾊为 1if(!dfs(i,1)){cout << "No" << endl;return;}}}}int main(){//输⼊}。