算法合集之《计算几何中的二分思想》.
- 格式:ppt
- 大小:248.00 KB
- 文档页数:29
二分思想的应用二分是我们再熟悉不过的字眼了,计算机科学由于其特殊性更是与“2”结下了不解之缘。
尽管二分思想本身很简单,但它的扩展性之强,应用面之广,仍然很有研究的价值.下面从最简单的二分查找开始逐步探究二分思想在信息学竞赛中的应用.一、二分查找问题如下:给定一个有序的数组,查找k是否在数组中。
分析:首先,将表中间位置记录的关键字与k比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功.容易知道算法的时间复杂度为O(logN)。
★好感统计(star.pas/c/cpp)[问题描述]在LazyCat同学的影响下,Roby同学开始听伊拉克的音乐,并且越来越喜欢萨达姆,尤其喜欢卡尔扎伊和Tony.可是,爱学习爱思考的Roby同学想,如果以后喜欢的伊拉克歌手越来越多怎么办呢?Roby怎么知道Roby最喜欢谁呢(Roby不知道谁知道呢……)?于是,goby同学求助于你.Roby首先会给你一张表,表上是所有他认识的伊拉克歌手的名字,一开始他对所有伊拉克歌手的好感度都为0。
然后RobY会告诉你一些他对某个伊拉克歌手的好感度变化.最后,请按照Roby对伊拉克歌手好感从大到小的顺序输出他们.[输入文件]输入文件star.in的第一行有一个整数N,表示Roby知道的伊拉克歌手数目.下面有N行,表示每一个Roby认识的伊拉克歌手的名字.接下来一行有一个整数K.再下面有2*K行,每两行为一组,上面一行为伊拉克歌手的名字Name,下面一行为一个整数,表示好感度变化量Change.[输出文件]输出文件star.out包括N*2行,依据伊拉克歌手们受RobY的好感度从大到小的顺序输出,每两行为一组,第一行输出伊拉克歌手的名字,第二行输出受Roby的好感度,[样例输入]3HhlsaGayZcLoveStudyTony5ZcLoveStudy100Tony8888ZcLoveStudy20Tony8888HhlsaGay-1000[样例输出]Tony17776ZcLoveStudy120HhlsaGay-1000[数据范围]对于40%的数据,保证N≤3000,K≤30000。
二分算法知识点一、知识概述《二分算法知识点》①基本定义:二分算法嘛,简单说就是一种在有序数据里找东西的办法。
就像你在一串按大小排好序的数字里找一个特定的数字。
每次都把这个有序的范围分成两部分,然后看看要找的东西是在左边那部分还是右边那部分,不断缩小这个范围,直到找到那个东西或者确定没有这个东西了。
②重要程度:在计算机科学里,这是个挺重要的算法呢。
不管是查找东西还是解决一些优化问题,经常会用到。
比如说查字典(当然这里夸张点类比,字典本身没有用二分法查找,但是这个查找思路类似),如果字典的单词是按照字母顺序排好的,二分法就好像你每次能快速定位到你要找的单词可能在的那一大部分页码,比一页一页翻可有效率多了。
③前置知识:得知道基本的顺序结构这些编程概念吧,如果是从数学角度理解,至少要知道大小比较,数据排序这些简单的知识。
因为二分法依赖于数据是有序的这个前提。
④应用价值:在很多数据查询系统里都会用到,就像在一个很大的学生成绩数据库里按照成绩排名查找某个特定分数段的学生,用二分算法就很快了。
在计算机游戏里查找某个合适的难度配置可能也会用到它,找到合适玩家的难度,让游戏玩起来既不会太简单又不会太难。
二、知识体系①知识图谱:在算法这部分知识里,二分算法是挺基础的查找和优化算法那一组的。
它依赖于数据结构里元素有序的部分知识。
②关联知识:和排序算法关系密切,因为二分算法要想正确运用,数据首先得是有序的。
跟查找有关的其他算法也有关联,像顺序查找,二分算法就是一种效率更高的查找改进。
③重难点分析:掌握难点在于那个范围一分为二之后的选择,到底是选左边还是右边部分继续。
关键是对数据有序这个概念要理解得透彻,还有每次分割范围时候边界的处理要很小心。
④考点分析:在计算机相关课程或者算法课程的考试里,如果有算法考核,这是个很基础的考点。
可能会出选择填空考考你对基本原理的理解,也可能让你写个简单的代码来实现二分查找给定数组里的某个元素这样的题目。
二分法计算点集最近的两个点及距离文章标题:探讨二分法在计算点集中最近的两个点及其距离中的应用在计算机科学和算法领域中,二分法是一种非常常见且有效的算法,它在许多问题的解决中发挥着重要作用。
其中,二分法在计算点集中最近的两个点及其距离时,也有着极其重要的应用。
本文将深入探讨二分法在这一问题中的应用,从简单到复杂、由浅入深地介绍二分法的原理,探讨其在计算最近点对时的实际应用,并分享一些个人观点和理解。
一、什么是二分法让我们简要介绍一下二分法的基本原理。
二分法,英文名为Binary Search,是一种在有序数组中查找特定元素的搜索算法。
其基本原理是每次将待查找区间对半分,然后确定要查找的值在哪一半,从而缩小查找范围,直到找到要查找的值或确定值不存在为止。
二、二分法在计算最近点对中的应用在计算最近点对的问题中,给定一个包含n个点的集合,需要找到集合中距离最近的两个点,并计算它们的距离。
对于这一问题,我们可以借助二分法来解决。
具体而言,我们可以首先根据点的横坐标对点集进行排序,然后利用二分法在排好序的点集中寻找最近点对。
由于排好序的点集在空间中具有一定的顺序关系,因此可以利用这一特性来优化查找过程,从而减少计算量。
在利用二分法查找最近点对时,我们可以将点集等分成两部分,然后分别在左右两部分中寻找最近点对。
然后再考虑中间部分的情况,这样就可以递归地求解最近点对的问题。
通过不断地将点集分割、计算和比较,最终可以找到整个点集中最近的两个点,并计算它们的距离。
三、二分法在计算最近点对中的实际应用二分法在计算最近点对的算法中有着广泛的实际应用价值。
通过巧妙地利用二分法,可以在较快的时间内找到点集中最近的两个点,并计算它们的距离。
这对于许多计算机图形学、空间数据分析等领域都具有重要意义。
在实际应用中,我们可以结合二分法和分治法来处理最近点对的问题,从而提高算法的效率和精度。
通过合理地设计算法流程和数据结构,可以使二分法在计算最近点对问题中发挥出色的效果。
计算几何中的二分思想——贵阳市第一中学程芃祺【摘要】本文简要阐述了计算几何中的二分思想,并通过例题对其进行应用,体现二分在计算几何中简洁高效的优势。
【关键字】计算几何二分【引言】二分思想,古已有之,邵子曰:“一分为二,二分为四,四分为八也。
”正是根据这样的思想,我们的祖先创造了太极八卦。
在当今的信息时代中,这一古老的智慧依旧闪耀着光芒,通过渗透到各门新兴学科中发扬光大,计算几何学就是其中之一。
在此基础上,产生了无数经典算法,例如用分治法求解最近点对、凸包、三角剖分和空间分区二叉树。
在近年来的各类信息学竞赛中,不断涌现了大批关于计算几何的试题,其中许多复杂的题目可以利用二分思想得到简单解决。
掌握了这一思想,无疑是多了一把解决相关问题的利器。
【例题解析】下面,就让我们通过几个例题,一起探究二分思想的应用。
例题一、Simplified GSM Network ( 2005 ACM/ICPC World Finals )题意:已知B(1≤B≤50)个信号站和C(1≤C≤50)座城市的坐标,坐标的绝对值不大于1000,每个城市使用最近的信号站。
给定R(1≤R≤250)条连接城市线路的描述和Q(1≤Q≤10)个查询,求相应两城市间通信时最少需要转换信号站的次数。
分析:显然,题目要求的是最短路,关键在于线路权值的计算。
题目中告诉我们:每个城市使用最近的信号站,也就是说,该城市所处位置位于平面中离这一信号站最近的点的轨迹内,而离各点最近点的轨迹就是V oronoi图。
因此,每条路线的权值就是这条线段所穿过的V oronoi边的数量。
由上可看出,题目即为求V oronoi图与最短路的简单组合,只需分别解决。
通过以上的分析,我们发现了一种最直接的办法:先求V oronoi图,再求最短路。
此法时间效率也足以通过测试,可是求V oronoi图的编程复杂度很高、调试麻烦,在真实的竞赛环境中实用性不强。
有没有更好一点的解法呢?考虑一条线段l,如果l两端点所属的信号站相同,显然l的权值为零,否则将l从中点(红点)分为两部分(分割点不在V oronoi边上)l1和l2,l所对应的权值自然就等于l1和l2的权值之和。
ʏ晏 江二分法,又称分半法,是求方程的近似解的常用方法㊂二分法简便而又应用广泛,对函数没有要求,任何方程都可以用二分法求相应的近似解,这就为函数知识的拓展与应用提供了一个更好的㊁更新的必需工具㊂一㊁求方程的近似解问题例1 已知函数f (x )=x 3+x 2-2x -2的一个正数零点附近的函数值用二分法逐次计算,参考数据如表1所示㊂表1f (1)=-2f (1.5)=0.625f (1.25)ʈ-0.984f (1.375)ʈ-0.260f (1.438)ʈ0.165f (1.4065)ʈ-0.052 那么方程x 3+x 2-2x -2=0的一个近似解(精确度为0.05)为( )㊂A.1.5 B .1.375C .1.438D .1.25分析:先利用函数零点的存在定理确定零点所在的区间,再结合零点所在区间的精确度确定零点区间的端点即为方程的近似解㊂解:因为f (1.4065)=-0.052<0,f (1.438)=0.165>0,所以f (1.4065)㊃f (1.438)<0㊂根据函数零点的存在定理知零点在区间(1.4065,1.438)内,即该方程的根在区间(1.4065,1.438)内㊂因为|1.4065-1.438|=0.0315<0.05,所以方程的近似解为1.4065或1.438㊂应选C ㊂利用二分法求方程近似解时,首先需要有初始区间,即一个存在解的区间(要用到此区间的两端点),其次需要有迭代,即循环运算的过程,具体表现在不断 二分 区间,最后需要有一个运算结束的标志,即当最终区间的两端点的精确度均满足题设要求时(两端点的近似值相同),运算终止㊂二㊁零点的应用问题例2 图1是函数f (x )的图像,它与x 轴有4个不同的公共点㊂给出的下列四个区间之中,存在不能用二分法求出的零点,该零点所在的区间是( )㊂图1A.[-2.1,-1]B .[4.1,5]C .[1.9,2.3]D .[5,6.1]分析:利用二分法,确定零点所在区间的两个端点所对应的函数值必须异号,由此判断函数的零点所在的区间㊂解:结合图像,可知选项A ,B ,D 中每个区间的两个端点的函数值异号,可用二分法求出零点㊂选项C 中区间的两个端点的函数值同号,不能用二分法求零点㊂应选C ㊂利用二分法求函数零点的依据是函数零点的存在定理,这也是利用二分法解决问题的必备条件㊂只有在满足函数零点的存在定理的前提下,才能利用二分法求函数的零点或方程的近似解㊂三㊁次数的判断问题例3 2是我们熟悉的无理数,在用二分法求2的近似值的过程中,可以构造函数f (x )=x 2-2(x >0),我们知道f (1)㊃f (2)<0,所以2ɪ(1,2)㊂要使2的近似值满足精确度为0.1,则对区间(1,2)至少二等分的次数为( )㊂A.3 B .4 C .5 D .6分析:利用二分法求二等分次数时,每次91知识结构与拓展高一数学 2023年11月二等分后的区间长度为原来的12,借助近似值满足的精确度,合理构建相应的不等式,从而求得二等分的次数㊂解:设对区间(1,2)至少二等分n 次,此时区间长为1㊂第1次二等分后区间长为12,第2次二等分后区间长为122,第3次二等分后区间长为123, ,第n 次二等分后区间长为12n ,n ɪN *㊂依题意可得,12n <0.1,即2n>10,所以n ȡ4㊂故n =4即为所求㊂应选B㊂利用二分法解决问题时,每经过一次操作,区间长度就变为原来的一半㊂借助二分法解决问题的思想方法,对于解决一些数学问题㊁现实生活问题等,都有很好的帮助与指导意义㊂四㊁实际应用问题例4 华罗庚是上世纪我国伟大的数学家,以华氏命名的数学科研成果有 华氏定理 华氏不等式 华王方法 等㊂除了数学理论研究,他还在生产一线大力推广了 优选法 和 统筹法 ㊂ 优选法 是指研究如何用较少的试验次数,迅速找到最优方案的一种科学方法㊂在防疫取得重要进展的时刻,为应对机场带来的境外输入,某机场海关在对入境人员进行检测时采用了 优选法 提高检测效率:每16人为一组,把他们的鼻咽拭子分泌物混合检查,如果为阴性则全部放行;若为阳性,则对该16人再次抽检确认感染者㊂某组16人中恰有一人感染(鼻咽拭子样本检验将会是阳性),若逐一检测可能需要15次才能确认感染者㊂现在先把这16人均分为2组,选其中一组8人的样本混合检查,若为阴性则认定感染者在另一组;若为阳性,则认定感染者在本组㊂继续把认定的这组的8人均分为2组,选其中一组4人的样本混合检查 以此类推,最终从这16人中认定那名感染者需要经过的检测次数为( )㊂A.3 B .4 C .6 D .7分析:根据题设条件,由16人进行二分法处理减少到8人,逐步减少到4人,2人,最后确定感染者㊂解:先把这16人均分为2组,选其中一组8人的样本混合检查,若为阴性则认定在另一组;若为阳性,则认定在本组,此时进行了1次检测;继续把认定的这组的8人均分为2组,选其中一组4人的样本混合检查,若为阴性则认定在另一组;若为阳性,则认定在本组,此时进行了2次检测;继续把认定的这组的4人均分为2组,选其中一组2人的样本混合检查,若为阴性则认定在另一组;若为阳性,则认定在本组,此时进行了3次检测;选认定的这组的2人中一人进行样本检查,若为阴性,则认定是另一个人;若为阳性,则认定为此人,此时进行了4次检测㊂所以最终从这16人中认定那名感染者需要经过4次检测㊂应选B㊂二分法体现了现代信息技术与数学知识的整合,将数学知识与信息技术紧密结合,恰当渗透算法思想和科学型计算器等,可以解决现实生活中的一些实际应用问题㊂函数f (x )=l n x -2x的零点所在的大致区间是( )㊂A .(1,2) B .(2,3)C .1e,1ɣ(3,4) D .(e ,+ɕ)提示:因为f (1)=-2<0,f (2)=l n 2-1<0,又f (x )在(0,+ɕ)上是单调增函数,所以在(1,2)上f (x )无零点㊂同理,可以判断在区间1e,1ɣ(3,4)和(e ,+ɕ)上f (x )无零点㊂因为f (3)=l n 3-23>0,所以f (2)㊃f (3)<0,所以f (x )在(2,3)上有一个零点㊂应选B ㊂作者单位:江苏省兴化市第一中学(责任编辑 郭正华)2 知识结构与拓展 高一数学 2023年11月。
编程思想与算法leetcode_⼆分算法详解⼆分算法通常⽤于有序序列中查找元素:1. 有序序列中是否存在满⾜某条件的元素;2. 有序序列中第⼀个满⾜某条件的元素的位置;3. 有序序列中最后⼀个满⾜某条件的元素的位置。
思路很简单,细节是魔⿁。
⼆分查找⼀.有序序列中是否存在满⾜某条件的元素⾸先,⼆分查找的框架:def binarySearch(nums, target):l = 0 #lowh = ... #highwhile l...h:m = (l + (h - l) / 2) #middle,防⽌h+l溢出if nums[m] == target:...elif nums[m] < target:l = ... #缩⼩边界elif nums[m] > target:h = ...return ... #查找结果其次,最基本的查找有序序列中的⼀个元素def binarySearch(nums, target):l = 0h = len(nums) - 1while l <= h :m = (l + (h - l) / 2)if nums[m] == target:return melif nums[m] < target:l = m + 1elif nums[m] > target:h = m - 1return -1循环的条件为什么是 <=,⽽不是 < ?答:要保证能遍历到数组的第⼀个元素和最后⼀个元素。
因为初始化 h 的赋值是 len(nums) - 1,即最后⼀个元素的索引,⽽不是len(nums)。
这⼆者可能出现在不同功能的⼆分查找中,区别是:前者相当于两端都闭区间 [l, h],后者相当于左闭右开区间 [l, h),因为索引⼤⼩为len(nums) 是越界的。
我们这个算法中使⽤的是 [l, h] 两端都闭的区间。
这个区间就是每次进⾏搜索的区间,我们不妨称为「搜索区间」(search space)。
二分图匹配算法总结(phoenixinter)二分图匹配算法总结二分图匹配算法总结二分图最大匹配的匈牙利算法二分图是这样一个图,它的顶点可以分类两个集合X和Y,所有的边关联在两个顶点中,恰好一个属于集合X,另一个属于集合Y。
最大匹配:图中包含边数最多的匹配称为图的最大匹配。
完美匹配:如果所有点都在匹配边上,称这个最大匹配是完美匹配。
最小覆盖:最小覆盖要求用最少的点(X集合或Y集合的都行)让每条边都至少和其中一个点关联。
可以证明:最少的点(即覆盖数)=最大匹配数最小路径覆盖:用尽量少的不相交简单路径覆盖有向无环图G的所有结点。
解决此类问题可以建立一个二分图模型。
把所有顶点i拆成两个:X结点集中的i和Y结点集中的i',如果有边i->j,则在二分图中引入边i->j',设二分图最大匹配为m,则结果就是n-m。
最大独立集问题:在N个点的图G中选出m个点,使这m个点两两之间没有边.求m最大值.如果图G满足二分图条件,则可以用二分图匹配来做.最大独立集点数 = N - 最大匹配数一、匈牙利算法设G=(V,{R})是一个无向图。
如顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属两个不同的子集。
则称图G为二分图。
v 给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配。
v 选择这样的边数最大的子集称为图的最大匹配问题(maximalmatching problem)v 如果一个匹配中,图中的每个顶点都和图中某条边相关联,则称此匹配为完全匹配,也称作完备匹配。
最大匹配在实际中有广泛的用处,求最大匹配的一种显而易见的算法是:先找出全部匹配,然后保留匹配数最多的。
但是这个算法的复杂度为边数的指数级函数。
因此,需要寻求一种更加高效的算法。
匈牙利算法是求解最大匹配的有效算法,该算法用到了增广路的定义(也称增广轨或交错轨):若P是图G中一条连通两个未匹配顶点的路径,并且属M的边和不属M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广路径。
算法思维:⼆分思想,舍弃思想,递归树思想前⾔思想:⼆分思想,舍弃思想,递归树思想,重点:数轴,树思想,栈思想,⼆分,多分思想,master公式⼀遇递归,直接造树!!递归,永远不要把它当作⼀个⽅法,你可以把它当作⼀个过程树先想想递归最⼤值:1.[L,R]上求最⼤值定:递归求最⼤,数轴,拆分为树解:1.⼆分思想,两个跑肯定⽐单个跑快--那么就涉及到中间,中间数的求法最好就是舍弃法2.中间为分界,左边跑,右边跑3.调⽤Math函数进⾏⽐较思维解:1.多叉树,2.利⽤栈后继遍历.3.悬⽽未决压⼊栈4.清晰的就出去5.⾼度上压栈悬⽽未决(有的孩⼦(⼦节点)不知道是多少)栈弹出,遇到我们的判断出递归条件规范:只有⼀个数?直接处理注:Math虽然好⽤,但只能⽤于判断回值.数据的交换,还是需交换⽅式,舍弃法(关于舍弃,很⼤的表现就是有效增益--可看⼒扣53.最⼤⼦序和)求最⼤使⽤树的⽅式,将我们要求的因⼦找出来,减少普通排序的⼀次次⽐较2.递归的master公式---(重点)定:递归的复杂度,递归的执⾏流程解:1.先树,栈的形式解析整个递归 ---发现树的⾼度就是递归的次数2.master公式的学习T(N)=a*(N/b)+O(N^d)主⽅法 = 次数*⼦⽅法+其它 --- 递归的主⽅法和⼦⽅法也就参数不⼀样a指的是调⽤⽅法次数,b指的是切割问题⼏段,,N指的是复杂度3.时间复杂度的计算1.log(b,a)>d--->复杂度O(N^log(b,a))2.log(b,a)复杂度O(N^d)3.log(b,a)==d--->复杂度O(O^d * logN)⼀般使⽤递归是为了职责分明,递归就进栈,弹栈就好了,弹栈是由⾃⼰写的条件控制.有多⼦递归时,那就树来⾛归并本质:⼆分排序,再合并归并的做法是:左侧⽐较完,右侧⽐较完,再最后左右⽐较还是两两交换,,不管是for循环,还是递归---两者都是使⽤⼆分思想来变成O(logN),本质是让两个数两两交互排序归并递归法我测试了它的递归⾛向发现它的⾛向是按照(终⽌条件,⽅法体控制的),递归的本质是都⾛怎么⾛,就是如果⾥⾯是双⼦递归,那么它会按树⾛,⾛的时候,是先左⼤节点,再左⼤节点的左⼦节点,再左⼤节点的右⼦节点.(往复进⾏),中途⾛到终⽌条件跳出,其它继续执⾏,,遇到很⼩的满⾜要求⽅法体的也会去执⾏.它的⽬的就是,整个流程我都整出来并且压⼊栈,执⾏完的或者遇到条件的就出去,按照你的控制停⽌,你有条件,满⾜就执⾏.必须明⽩的递归弹栈数组为{11,8,9,4,12,3,7,6}--[0,7]开始,进栈[0,7],遇到⼦,再进栈[0,3],遇到⼦,再进栈[0,1],再遇到再进,直到遇到该停⽌的,再不断的弹,弹出这⼀步,⾛下⼀步,下⼀步再弹,再...简单没有弹,只是顺序执⾏的流程这是⼀个,没有终⽌弹栈的流程原数据:11,8,9,4,12,3,7,6递归流程:0--1⽅法执⾏:8 11递归流程:2--3⽅法执⾏:4 9递归流程:0--3⽅法执⾏:4 8 9 11递归流程:4--5⽅法执⾏:3 12递归流程:6--7⽅法执⾏:6 7递归流程:4--7⽅法执⾏:3 6 7 12递归流程:0--7⽅法执⾏:3 4 6 7 8 9 11 12输出结果:3 4 6 7 8 9 11 12归并排序代码:public class MergeSortTest {// 解---由⼤到⼩解决,// 1.解递归// 0,R都是数组下标public void process(int arr[],int L,int R){if(L==R){ // 结束标志,也就是叶⼦节点结束return;}int m = L+((R-L)>>1);process(arr,L,m); //----L----m-----R-- 不仅仅⼀个,是树process(arr,m+1,R);/* System.out.println("递归流程"+":"+L + "--" + R);*/merge(arr,L,m,R);}// 2.解排序--按照最基本的叶⼦进⾏计算,满⾜最基本的LMR的叶⼦进⾏思考,如 529public void merge(int arr[],int L,int M,int R){// 定:要使得两边有序 ---// 解:最基本的叶⼦,529---// 需求:指针,[L,M]边的,[M,R]边的int p1 = L;int p2 = M+1;// 辅助数组存值int help[] = new int[R-L+1];int i = 0; // 辅助的指针// 节点卡标while (p1 <= M && p2 <= R){ // 有⼀个指针满⾜就停⽌help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++]; // 此时必定会将⼀边的全打进去}while (p1 <= M){help[i++] = arr[p1++];}while (p2 <= R){help[i++] = arr[p2++];}for (int j = 0; j < help.length; j++) {arr[L+j] = help[j];}/*// merge⽅法体流程!System.out.print("⽅法执⾏:");for (int i1 : help) {System.out.print(i1+" ");}System.out.println();*/}public static void main(String[] args) {MergeSortTest mergeSortTest = new MergeSortTest();int arr[] = new int[]{11,8,9,4,12,3,7,6};System.out.println("原数据:"+ "11,8,9,4,12,3,7,6");mergeSortTest.process(arr,0,arr.length-1);System.out.print("输出结果:");for (int i : arr) {System.out.print(i+" ");}}}BS:本⼈⽬前也是在算法的路上不断探索中,试图和数据结构以及⼏何进⾏挂钩的学习,没有图形的算法是没有灵魂的!⽂章中可能有很多不对的地⽅,希望能多多指教,评论;博主在此感谢!。
二分图的概念二分图又称作二部图,是图论中的一种特殊模型。
设G=(V, E)是一个无向图。
如果顶点集V可分割为两个互不相交的子集X和Y,并且图中每条边连接的两个顶点一个在X中,另一个在Y中,则称图G为二分图。
二分图的性质定理:当且仅当无向图G的每一个回路的次数均是偶数时,G才是一个二分图。
如果无回路,相当于任一回路的次数为0,故也视为二分图。
二分图的判定如果一个图是连通的,可以用如下的方法判定是否是二分图:在图中任选一顶点v,定义其距离标号为0,然后把它的邻接点的距离标号均设为1,接着把所有标号为1的邻接点均标号为2(如果该点未标号的话),如图所示,以此类推。
标号过程可以用一次BFS实现。
标号后,所有标号为奇数的点归为X部,标号为偶数的点归为Y部。
接下来,二分图的判定就是依次检查每条边,看两个端点是否是一个在X部,一个在Y部。
如果一个图不连通,则在每个连通块中作判定。
二分图匹配给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配。
图中加粗的边是数量为2的匹配。
最大匹配选择边数最大的子图称为图的最大匹配问题(maximal matching problem)如果一个匹配中,图中的每个顶点都和图中某条边相关联,则称此匹配为完全匹配,也称作完备匹配。
图中所示为一个最大匹配,但不是完全匹配。
增广路径增广路径的定义:设M为二分图G已匹配边的集合,若P是图G中一条连通两个未匹配顶点的路径(P的起点在X部,终点在Y部,反之亦可),并且属M的边和不属M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广路径。
增广路径是一条“交错轨”。
也就是说, 它的第一条边是目前还没有参与匹配的,第二条边参与了匹配,第三条边没有..最后一条边没有参与匹配,并且起点和终点还没有被选择过,这样交错进行,显然P有奇数条边(为什么?)红边为三条已经匹配的边。
从X部一个未匹配的顶点x4开始,找一条路径:x4,y3,x2,y1,x1,y2x4,y3,x2,y1,x1,y2因为y2是Y部中未匹配的顶点,故所找路径是增广路径。