HDU 5313 Bipartite Graph

来源:互联网 发布:火车票网络订票时间 编辑:程序博客网 时间:2024/06/06 06:46

题目名称是二分图,但确实不是二分图!做这道题目,只需要知道什么是完全二分图就行了。
完全二分图概念(来自度娘):完全二分图是一种特殊的二分图,可以把图中的顶点分成两个集合,使得第一个集合中的所有顶点都与第二个集合中的所有顶点相连。

题目大意:已有一个N个点,M条边的二分图,要求你增加一些边,使其成为一个完全二分图。问最多能加多少条边?不允许有重边的情况。
我们可以简单的得出一个结论:若左边L个点,右边R个点,边的条数等于L * R。
大概思路:我们只需要将点根据输入,分成两部分(可以用并查集维护)!那么可能还有一些点并没有区分出是属于哪一部分的,那么我们要考虑添加的边尽量多,那这些点应该放在哪一边?我的思考是用剩余的没有关联的点往这两个两个集合里面放,使其点的个数尽量相等。
还是简单的说明一下吧。设左边的点的个数是L,右边的点的个数的R,有L + R = N。那么要求的就是L * R的最大值,即求 L * (N - L) 的最大值 。这不就是一个求一个二次函数的最大值么?

这道题目是我以前比赛的时候做的题目,当时AC的代码实在是太丑了,今天实在是没有时间了,就不重新写了,也不贴代码,等比赛回来有时间在更新一下这篇博客就行了。

更新时间:2015.11.21

主要是觉得自己前面讲的太敷衍太简单了,想想还是更新一段吧。

前面讲到用并查集来维护,其实也不好写,因为会出现许多并不连通的情况,比如说这样的数据:
8 3
1 2
1 3
4 5

在这组数据中1 3和2在两个不同的集合里,4和5也在两个不同的集合里,而6可以再任意的集合中。我们转换下思维,可以得到这样的一些数据a1.x=1(2)和a1.y=2(1, 3),a2.x=1(4)和a2.y=1(5),k=3(6, 7, 8)。我们需要将这些数据组合一下,组成两个元素个数相差最少的集合。可以这样去组合,a1.x+a2.x+2==4。那么结果就是4*4-3==13,我们最多可以再添加13条边。其实这就是一个贪心,是吧?
怎么贪呢?这才是本题的关键。用前面的a1,a2,a3…去拼凑一个小于等于N/2,大于等于N/2-k的数。当然可以用dp,但是完全可以不这么难。想象一下,你有两个桶,若两个桶里的元素相等,ai.x和ai.y就可以随便放,不然就将ai.x和ai.y中大的那个数放进元素个数小的那个桶里,另一个则放进另一个桶里。这样就先将两个桶尽量平衡了,之后再用k分成两份,再分别放进两个桶里,使两个桶的元素个数更平衡。(其实这个贪心我并不能证明,但也没有想出反例,反正比赛的时候是过了的,可能是测试数据弱的原因吧)
然后就可以得出结果了。

0 0
原创粉丝点击