小哼今天和小伙伴们一块儿去游乐场玩,终于能够坐上求之不得的妹子过山车了。
过山车的每一排只有两个座位,为了安全起见,(对,必定是这个缘由)每一个女生必须与一个男生坐一排。可是,每一个人都但愿与本身认识的人坐在一块儿。举个例子吧,11号女生与11号男生互相认识,所以11号女生能够和11好男生坐在一块儿。另外11号女生-号男生互相认识,所以他们也能够坐在一块儿。像这样的关系的还有22号女生和22号男生、22号女生和33号男生、33号女生和11号男生。请问如何安排座位才能让更多的人满意呢?这仅仅是个例子。实际状况要复杂得多,由于小哼的小伙伴们实在是太多了。11号女生与11号男生互相认识,所以11号女生能够和11好男生坐在一块儿。另外11号女生与22号男生互相认识,所以他们也能够坐在一块儿。像这样的关系的还有22号女生和22号男生、22号女生和33号男生、33号女生和11号男生。请问如何安排座位才能让更多的人满意呢?这仅仅是个例子。实际状况要复杂得多,由于小哼的小伙伴们实在是太多了。
首先咱们先将这个问题模型化,如上图,左边的顶点是女生,右边的顶点是男生。若是顶点之间右边,就表示他们能够坐在一块儿,像这样特殊的图叫作二分图(注意二分图是无向图哦)。对于上面的例子,咱们很容易找出两种分配方案,以下。
安全
小插曲-- 二分图的应用
begin:
end;
spa
很显然,右边的分配方案更好。咱们把一种分配方案叫作一种匹配。那么如今的问题就演变成了求二分图的最大匹配(匹配对数多)。求最大匹配容易想到的办法是:找出所有匹配,而后输出配对数最多的。这种方法的时间复杂度是很是之高的,那还有没有更好的办法呢? 咱们能够这么想,首先先从左边的11号女生开始考虑。先让她与11号男生配对,配对成功后就考虑22号女生与22号男生配对,接下来考虑33号女生。此时咱们发现33号女生只可以跟11号男生配对,但是11号男生已经配对给了11号女生了,怎么办?其实咱们可让33号女生跟11号男生谈。让与11号男生相配对的11号女生一块儿谈,看看一号女生能不可以找到其余的同伴。若是可以找到,就让33号女生与11号男生坐在一块儿,让11号女生与11号女生相配对的那我的坐在一块儿,若11号女生找到的其余的能够与11号女生配对的人已经有同伴的话就让他的同伴去找,看看其余人可否做为她的同伴,而后以此类推。若第ii名男生找到了同伴,就将答案加11。刚才的匹配过程就叫作增广路,不难发现,只要找到了一条增广路答案就会加11,最后只须要输出答案便可。
谢谢你们的支持!顺手点个赞鸭,嘻嘻!
3d