【BZOJ4155】[Ipsc2015]Humble Captains

Description

每天下午放学时都有n个zky冲出教室去搞基。搞基的zky们分成两队,编号为1的zky是1号队的首领,编号为2的zky是2号队的首领。其他的zky可以自由选择是去1队还是2队。
zky们当中有几对zky是好基友(同一个zky可能在多对“好基友”关系中),如果一对好基友在同一个队,那么这个队的战斗力就+1。
现在你要解决两个问题:1.两队战斗力之和最大是多少?2.两队战斗力之差的绝对值最小是多少?
注意:这两个问题是不相关的。也就是说,问1和问2的方案可以是不一样的。

Input

第一行t表示数据组数
每一组测试数据的第一行包含两个整数n,m,zky们编号从1到n,共有m对好基友关系。
接下来m行每行两个整数u和v,表示u和v之间存在好基友关系。保证每一对好基友关系只会被描述一次。

Output

对每一组,输出一行两个数,第一个是最大战斗力之和,第二个是最小战斗力之差。

Sample Input

2
3 3
1 2
2 3
1 3

3 1
1 3

Sample Output

1 1
1 0

HINT

n <= 200, t <= 250

题解:第一问不会的去练最小割,第二问不会的去做阿狸和桃子的游戏。

然而本题第二问求的是差最小,那么把贪心换成 搭建双塔 即可。

但是复杂度有点高,用bitset优化即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <bitset>
using namespace std;
int n,m,T,cnt,ans;
int pa[300],pb[300],to[100000],next[100000],val[100000],head[300],d[300],D[300];
bitset<80010> f;
queue<int> q;
inline void add(int a,int b)
{
to[cnt]=b,val[cnt]=1,next[cnt]=head[a],head[a]=cnt++;
to[cnt]=a,val[cnt]=1,next[cnt]=head[b],head[b]=cnt++;
}
int dfs(int x,int mf)
{
if(x==2) return mf;
int i,temp=mf,k;
for(i=head[x];i!=-1;i=next[i]) if(d[to[i]]==d[x]+1&&val[i])
{
k=dfs(to[i],min(temp,val[i]));
if(!k) d[to[i]]=0;
val[i]-=k,val[i^1]+=k,temp-=k;
if(!temp) break;
}
return mf-temp;
}
inline int bfs()
{
memset(d,0,sizeof(d));
while(!q.empty()) q.pop();
int i,u;
d[1]=1,q.push(1);
while(!q.empty())
{
u=q.front(),q.pop();
for(i=head[u];i!=-1;i=next[i]) if(!d[to[i]]&&val[i])
{
d[to[i]]=d[u]+1;
if(to[i]==2) return 1;
q.push(to[i]);
}
}
return 0;
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void work()
{
n=rd(),m=rd(),ans=0;
int i,a,b;
memset(head,-1,sizeof(head)),memset(D,0,sizeof(D)),cnt=0;
for(i=1;i<=m;i++) a=rd(),b=rd(),add(a,b),D[a]++,D[b]++;
while(bfs()) ans+=dfs(1,1<<30);
printf("%d ",m-ans);
f.reset(),f[n*n+D[1]-D[2]]=1;
for(i=3;i<=n;i++) f=(f<<D[i])|(f>>D[i]);
for(i=0;i<=n*n;i++) if(f[n*n+i]||f[n*n-i])
{
printf("%d\n",i>>1);
return ;
}
}
int main()
{
T=rd();
while(T--) work();
return 0;
}

最新文章

  1. 偷懒小工具 - SSO单点登录通用类(可跨域)
  2. CSS计数器
  3. Codeforces Round #312 (Div. 2) E. A Simple Task
  4. PHP正则表达式匹配中文字符
  5. Xcode7.1与iOS9之坑
  6. openerp 中如何方便对搜索时间段
  7. 通过百度获取IP地址对应的经纬度
  8. MVC EF 增 删 改 查
  9. NoFragment重大bug
  10. JAVA 练习 找出素数
  11. 全面剖析Redis Cluster原理和应用
  12. python接口自动化(四)--接口测试工具介绍(详解)
  13. python中*args,**kwargs
  14. JavaScript之能力与硬件检测[小结]
  15. for之于while的优势
  16. python之旅:字符编码
  17. freeipa未授权遍历注册账户漏洞
  18. playbook实现nginx安装
  19. IE类兼容一
  20. NumPy来自现有数据的数组

热门文章

  1. Windows下搭建HTK
  2. HTTP长连接?短连接?长轮询?短轮询?
  3. ubuntu下安装自动补全YouCompleteMe
  4. 【Android】16.2 Started Services
  5. linux(二十一):apache服务配置(二)
  6. Android Shape 形状
  7. 优化神器 beamoff
  8. Android从无知到有知——NO.5
  9. ENGINE_API CXSroll
  10. meta 标签的学习