传送门:https://nanti.jisuanke.com/t/39271
题意:
给你n个人,每个人有一个权值 a_i ,(a_i是可以被100整除的))现在需要你将n个人分成两组,有m个关系,a和b有关系代表a和b不能放在同一个组内,为了两组实力尽量平均,要你求两组权值差值最小时最大的值是哪一个
题解:
二分图染色+dp
首先我们知道n个人必须全选分为两组,其次题目保证有解
因此我们很容易想到如果a->b,b->c,那么a一定和c要分在同一组内
这样我们就得到了很多个联通块
错误想法:我们得到了num个联通块后直接将num个联通块做01背包就可以求出差值最小时最大值,dp状态定义为前i个物品,容量为j时的最大值,但是实际上这样有可能把错误的情况考虑进来,例如两个矛盾的块同时放进一个背包,例如这组数据
2
4 1
300 300 100 500
1 2
6 4
1000 2000 1000 1500 1000 1500
1 2
2 3
4 5
5 6
01背包得到的答案是600 和 4000,实际上应该是 800和5000
正确想法,我们将物品分成联通块后,对分成的两个联通块做差值,之后枚举差值能否达到才是最优解,为了防止差值为负,我们在中间加上一个比较大的数即可
代码:
错误写法:
#include
#include
正确写法:
#include
#include