二分图思想-趣味-包你学会!

小哼今天和小伙伴们一起去游乐场玩,终于可以坐上梦寐以求的妹子过山车了。
二分图思想-趣味-包你学会!_第1张图片
过山车的每一排只有两个座位,为了安全起见,(对,一定是这个原因)每个女生必须与一个男生坐一排。但是,每个人都希望与自己认识的人坐在一起。举个例子吧,11号女生与11号男生互相认识,因此11号女生可以和11好男生坐在一起。另外11号女生-号男生互相认识,因此他们也可以坐在一起。像这样的关系的还有22号女生和22号男生、22号女生和33号男生、33号女生和11号男生。请问如何安排座位才能让更多的人满意呢?这仅仅是个例子。实际情况要复杂得多,因为小哼的小伙伴们实在是太多了。11号女生与11号男生互相认识,因此11号女生可以和11好男生坐在一起。另外11号女生与22号男生互相认识,因此他们也可以坐在一起。像这样的关系的还有22号女生和22号男生、22号女生和33号男生、33号女生和11号男生。请问如何安排座位才能让更多的人满意呢?这仅仅是个例子。实际情况要复杂得多,因为小哼的小伙伴们实在是太多了。二分图思想-趣味-包你学会!_第2张图片
首先我们先将这个问题模型化,如上图,左边的顶点是女生,右边的顶点是男生。如果顶点之间右边,就表示他们可以坐在一起,像这样特殊的图叫做二分图(注意二分图是无向图哦)。对于上面的例子,我们很容易找出两种分配方案,如下。
二分图思想-趣味-包你学会!_第3张图片

小插曲-- 二分图的应用

begin:
二分图思想-趣味-包你学会!_第4张图片
end;

很显然,右边的分配方案更好。我们把一种分配方案叫做一种匹配。那么现在的问题就演变成了求二分图的最大匹配(匹配对数多)。求最大匹配容易想到的办法是:找出全部匹配,然后输出配对数最多的。这种方法的时间复杂度是非常之高的,那还有没有更好的办法呢? 我们可以这么想,首先先从左边的11号女生开始考虑。先让她与11号男生配对,配对成功后就考虑22号女生与22号男生配对,接下来考虑33号女生。此时我们发现33号女生只能够跟11号男生配对,可是11号男生已经配对给了11号女生了,怎么办?其实我们可以让33号女生跟11号男生谈。让与11号男生相配对的11号女生一起谈,看看一号女生能不能够找到其他的同伴。如果能够找到,就让33号女生与11号男生坐在一起,让11号女生与11号女生相配对的那个人坐在一起,若11号女生找到的其他的可以与11号女生配对的人已经有同伴的话就让他的同伴去找,看看其他人能否作为她的同伴,然后以此类推。若第ii名男生找到了同伴,就将答案加11。刚才的匹配过程就叫做增广路,不难发现,只要找到了一条增广路答案就会加11,最后只需要输出答案即可。
谢谢大家的支持!顺手点个赞鸭,嘻嘻!

你可能感兴趣的:(c++入门,c++,算法,数据结构,图论)