题目链接:

     TP

题解:

  对于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】朋友圈的更多相关文章

  1. bzoj 2744: [HEOI2012]朋友圈 二分图匹配

    2744: [HEOI2012]朋友圈 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 612  Solved: 174[Submit][Status] ...

  2. 【刷题】BZOJ 2744 [HEOI2012]朋友圈

    Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...

  3. bzoj 2744 [HEOI2012]朋友圈——补图!+匈牙利算法

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2744 求最大的团<==>补图(有边的变成没边.没边的变成有边)的最大独立集! A ...

  4. bzoj 2744: [HEOI2012]朋友圈

    #include<cstdio> #include<iostream> #define M 3010 using namespace std; ],u[M*M>>] ...

  5. 【BZOJ 2744】 2744: [HEOI2012]朋友圈 (最大团,二分图匹配,构图)

    2744: [HEOI2012]朋友圈 Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他 ...

  6. 【BZOJ 2744 】[HEOI2012]朋友圈

    Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...

  7. BZOJ2744:[HEOI2012]朋友圈(最大团,乱搞)

    Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...

  8. luogu P2423 [HEOI2012]朋友圈 (最大团)

    在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着. 一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大数目.两个国家看成是 ...

  9. 【二分图】HEOI2012 朋友圈

    题目内容 洛谷链接 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着. 一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大 ...

  10. BZOJ2744: [HEOI2012]朋友圈

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2744 最大团是一个np问题.. 对于本题,做它的逆问题,建反图做最大独立集. 对于A最多取出两 ...

随机推荐

  1. spring boot之入门配置(一)

    yml.properties配置文件 yml相比properties配置文件,yml可以省略不必要的前缀,并且看起来更加的有层次感.推荐使用yml文件. @Value 根据配置文件的配置项获取对应的v ...

  2. Gradle初探

    (一):创建一个Gradle项目 1. 环境准备 1.1. 先上Gradle官网下载最新版的程序,地址:https://gradle.org/gradle-download/. 1.2. 配置环境变量 ...

  3. WSGI及gunicorn指北(二)

    pyg0已经大概了解了wsgi.现在他决定深入探索他们实际在生产环境里用到的web 服务器 -gunicorn. 先来看看官网的介绍:Gunicorn 是一个运行在Unix上的python WSGI ...

  4. 从__acrt_first_block == header 谈起,记录dll链接不一致的问题

    最近写了一个postgresql的数据库连接池dll.写的比较随意,某个头文件如下: #pragma once #include "common.h"#include " ...

  5. 完整的WebRTC调用序列图

    说在前面的话:此图出自Rea-Time Communication with WebRTC: https://book.douban.com/subject/25849712/ 的第五章.

  6. Android Gradle使用总结

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/77678577 本文出自[赵彦军的博客] 其他 Groovy 使用完全解析 http ...

  7. 物流的纯css实现方法

    首先我们来看看UI给出的设计图. 为什么到达是最前面,为什么物流顺序是倒叙的,这是什么用户习惯,这是我拿到设计稿的问题,但是这里不谈设计,因为审美这个东西无法评估.那么这里我就做一个顺序的来对比一下吧 ...

  8. python爬虫入门(六) Scrapy框架之原理介绍

    Scrapy框架 Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬 ...

  9. c语言,数据结构,链表的一些操作总结

    下面是自己的一些学习操作以及总结,能用我会很开心,有不足之处,欢迎大家提出宝贵的意见! c语言链表是一种基本的数据结构,与顺序表一样属于线性表,但是顺序表在内存中的存储单元是连续的,这样就对内存的要求 ...

  10. String的trim()用于去掉字符串前后的空格

    String的trim()可以去掉字符串的前导和后继字符串,即去掉字符串前面和后面的空格. eg:String userName = " good man "; System.ou ...