【BZOJ 2744】【HEOI2012】朋友圈
题目链接:
题解:
对于A国,我们发现,最大团一定不大于2。对于B国,发现同奇偶性点之间都有边,不同奇偶性之间可能有边,也就是说对于B国是一个二分图最大团,也就是求B国补图的二分图最大独立集。然后,我们枚举使用A国的人员,将其与B国连接的点做一个补图,跑跑匈牙利即可。
【注】大视野上测试点和题面不一样啊!MMP没有t读入,只有一组数据,日哦!!
代码:
#include <cstdio>
#include <iostream>
#include <cstring> using namespace std; inline int read(){
int s=,k=;char ch=getchar();
while(ch<''|ch>'') ch=='-'?k=-:,ch=getchar();
while(ch>&ch<='') s=s*+(ch^),ch=getchar();
return s*k;
} const int N=3e3+; int A,B,M; struct edges{
int v;edges *last;
}edge[N*N],*head[N<<];int cnt; inline void push(int u,int v){
edge[++cnt]=(edges){v,head[u]};head[u]=edge+cnt;
} struct Country{
int sgl[N<<],cpl[N<<];
int cnt_sgl,cnt_cpl;
int val[N<<],re[N<<];
inline void add(int x,int pos){
if(x&){
sgl[++cnt_sgl]=pos;
val[pos]=x;re[pos]=cnt_sgl;
}else{
cpl[++cnt_cpl]=pos;
val[pos]=x;re[pos]=cnt_cpl;
}
}
inline void clear(){
cnt_sgl=cnt_cpl=;
}
}a,b; int f[N<<];bool vis[N<<]; inline bool find(int x){ for(edges *i=head[x];i;i=i->last){
if(!vis[i->v]){
vis[i->v]=true;
if(f[i->v]==-||find(f[i->v])){
f[i->v]=x;
return true;
}
}
}
return false;
} int v[][N<<],size[N<<],tt[N<<]; inline void build(){
for(int i=;i<=b.cnt_sgl;i++)
if(tt[b.sgl[i]]==){
for(int j=;j<=b.cnt_cpl;j++)
if(tt[b.cpl[j]]==){
int x=b.val[b.sgl[i]]|b.val[b.cpl[j]];
int t();
while(x) t+=x&,x>>=;
if((~t)&)
push(i,j);
}
}
} inline int solve(){
memset(f,-,sizeof(f));
int ret=;
for(int i=;i<=B;i++)
ret+=tt[i]==;
for(int i=;i<=b.cnt_sgl;i++){
if(tt[b.sgl[i]]==){
memset(vis,,sizeof(vis));
if(find(i))
ret--;
}
}
return ret;
} inline void clear(){
memset(head,,sizeof(head));
cnt=;
} int main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
clear();
a.clear();b.clear();
memset(v,,sizeof(v));
memset(size,,sizeof(size));
A=read(),B=read(),M=read();
for(int i=;i<=A;i++) a.add(read(),i);
for(int i=;i<=B;i++) b.add(read(),i);
for(int i=,u,vv;i<=M;i++){
u=read(),vv=read();
v[u][++size[u]]=vv;
}
for(int i=;i<=B;i++)
tt[i]=;
build();
int ans=(a.cnt_sgl>)+(a.cnt_cpl>);
ans=max(ans,solve());
memset(tt,,sizeof(tt));
for(int i=;i<=a.cnt_sgl;i++){
for(int j=;j<=size[a.sgl[i]];j++)
tt[v[a.sgl[i]][j]]=;
clear();
build();
ans=max(ans,solve()+);
for(int j=;j<=size[a.sgl[i]];j++)
tt[v[a.sgl[i]][j]]=;
}
for(int j=;j<=a.cnt_cpl;j++){
for(int k=;k<=size[a.cpl[j]];k++)
tt[v[a.cpl[j]][k]]=;
clear();
build();
ans=max(ans,solve()+);
for(int k=;k<=size[a.cpl[j]];k++)
tt[v[a.cpl[j]][k]]=;
}
for(int i=;i<=a.cnt_sgl;i++){
for(int j=;j<=size[a.sgl[i]];j++)
tt[v[a.sgl[i]][j]]++;
for(int j=;j<=a.cnt_cpl;j++){
for(int k=;k<=size[a.cpl[j]];k++)
tt[v[a.cpl[j]][k]]++;
clear();
build();
ans=max(ans,solve()+);
for(int k=;k<=size[a.cpl[j]];k++)
tt[v[a.cpl[j]][k]]--;
}
for(int j=;j<=size[a.sgl[i]];j++)
tt[v[a.sgl[i]][j]]--;
}
printf("%d\n",ans); }
【BZOJ 2744】【HEOI2012】朋友圈的更多相关文章
- bzoj 2744: [HEOI2012]朋友圈 二分图匹配
2744: [HEOI2012]朋友圈 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 612 Solved: 174[Submit][Status] ...
- 【刷题】BZOJ 2744 [HEOI2012]朋友圈
Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...
- bzoj 2744 [HEOI2012]朋友圈——补图!+匈牙利算法
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2744 求最大的团<==>补图(有边的变成没边.没边的变成有边)的最大独立集! A ...
- bzoj 2744: [HEOI2012]朋友圈
#include<cstdio> #include<iostream> #define M 3010 using namespace std; ],u[M*M>>] ...
- 【BZOJ 2744】 2744: [HEOI2012]朋友圈 (最大团,二分图匹配,构图)
2744: [HEOI2012]朋友圈 Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他 ...
- 【BZOJ 2744 】[HEOI2012]朋友圈
Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...
- BZOJ2744:[HEOI2012]朋友圈(最大团,乱搞)
Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...
- luogu P2423 [HEOI2012]朋友圈 (最大团)
在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着. 一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大数目.两个国家看成是 ...
- 【二分图】HEOI2012 朋友圈
题目内容 洛谷链接 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着. 一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大 ...
- BZOJ2744: [HEOI2012]朋友圈
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2744 最大团是一个np问题.. 对于本题,做它的逆问题,建反图做最大独立集. 对于A最多取出两 ...
随机推荐
- DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=2 (转载)
http://blog.csdn.net/xiyuan1999/article/details/5706230 DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, ...
- 使用HttpClient进行https连接(一)
一.生成密钥库和证书 1.生成服务器证书库 keytool -validity 365 -genkey -v -alias uyun -keyalg RSA -keystore /opt/UEM/ke ...
- Axis创建webservice客户端和服务端
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者:永恒の_☆ 地址:http://blog.csdn.net/chenghui0317/ ...
- java——封装和关键字
封装:将类的属性和方法的实现细节隐藏起来的过程 封装的好处:1重用性(代码)2,利于分工3,隐藏细节 访问关键字:public private 默认访问修饰符,protected static关键字 ...
- Android之动画
Android的动画可以分为三种,View动画.帧动画.属性动画.View动画通过对场景里的对象不断做图像变化(平移.缩放.旋转.透明度)从而产生动画效果,它是一种渐进式动画,而且View动画支持自定 ...
- Jenkins实现Android自动化打包
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/77102359 本文出自[赵彦军的博客] 1.Tomcat 进入 https://t ...
- wxpython实现界面跳转
wxPython实现Frame之间的跳转/更新的一种方法 wxPython是Python中重要的GUI框架,下面通过自己的方法实现模拟类似PC版微信登录,并跳转到主界面(朋友圈)的流程. (一)项目目 ...
- JavaScript要点汇总——The Most Important
关于JavaScript的基础变量,运算符的详解以及基本的分支循环嵌套已经在 JS基础变量及JS中的运算符 JS中的循环分支嵌套 说过了,今天我们所说的是做网页中最长用到的东西.内容不算少,要有耐心, ...
- 如何利用Python网络爬虫抓取微信朋友圈的动态(上)
今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...
- oracle 游标简单示例
1.游标的概念以及作用 游标(Cursor)可以使用户想操作数组一样对查询出来的结果集进行操作,可以形象的看做一个变动的光标,其实际行是一个指针,它在一段Oracle存放数据查询结果集或数据 操作集的 ...