题意
每天下午放学时都有n个zky冲出教室去搞基。搞基的zky们分成两队,编号为1的zky是1号队的首领,编号为2的zky是2号队的首领。其他的zky可以自由选择是去1队还是2队。
zky们当中有几对zky是好基友(同一个zky可能在多对“好基友”关系中),如果一对好基友在同一个队,那么这个队的战斗力就+1。
现在你要解决两个问题:1.两队战斗力之和最大是多少?2.两队战斗力之差的绝对值最小是多少?
注意:这两个问题是不相关的。也就是说,问1和问2的方案可以是不一样的。
n <= 200, T <= 250,其中T表示有T组数据
分析
第一问的话,直接把1看成源点,2看成汇点,m-最小割即为答案。
第二问的话,参考 阿狸和桃子的游戏 那题,把每个点的权值看成是度数,然后dp一遍即可,可以用bitset来优化。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<bitset>
#include<queue>
const int N=505;
const int inf=1000000000;
int n,m,cnt,last[N],dis[N],cur[N],deg[N];
struct edge{
int to,next,c;}e[N*N];
std::