题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2744

首先,求一个图的最大团等价于求它的补图的最大独立集,而二分图的最大独立集 = 总点数 - 最大匹配数;

所以先把图转化成补图,也就是A国奇、偶点各自成团,B国奇、偶点相互连边而其内部无边,还有些A到B的边用邻接矩阵存了;

可以发现A国最多只能选出两个点来,而A国选的那些点会影响B国的最大独立集;

发现A国点很少,不妨暴力枚举!

注意计算最大独立集时减去的数 tmp,原来写的是 tmp = 最大匹配数,其中左部点(B国奇数点)不管,右部点和A国点相连的也匹配;

想的是右部点中和A国相连的就算匹配上了也会算在减去的部分,但这样不太对呢,而且会少算左部点中和A国相连的;

所以直接再来一个 out 数组表示和A国点相连,把B国中左右部的 out 点都算上,然后匹配时不去匹配 out 的右部点;

虽然感觉挺麻烦但其实也挺好写的。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int const maxn=;
int A,B,m,a[],b[maxn],pre[maxn],ans,tmp,sid[][maxn];
bool vis[maxn],out[maxn];
vector<int>vb[maxn];
bool dfs(int x)
{
for(int i=;i<vb[x].size();i++)
{
int u=vb[x][i];
if(vis[u]||out[u])continue; vis[u]=;
if(!pre[u]||dfs(pre[u])){pre[u]=x;return ;}
}
return ;
}
bool ck(int x,int y)
{
int k=(x|y),ret=;
for(;k;k-=(k&-k))ret++;
return (ret&);
}
int main()
{
scanf("%d%d%d",&A,&B,&m);
for(int i=;i<=A;i++)
{
scanf("%d",&a[i]);
// if(a[i]&1)a1.push_back(i);
// else a2.push_back(i);
}
for(int i=;i<=B;i++)
{
scanf("%d",&b[i]);
for(int j=;j<i;j++)
{
if(ck(b[i],b[j])||(b[i]^b[j])%==)continue;//补图上无边
vb[i].push_back(j),vb[j].push_back(i);
}
}
for(int i=,x,y;i<=m;i++){scanf("%d%d",&x,&y); sid[x][y]=;}
for(int j=;j<=B;j++)
{
if(b[j]%==)continue;//不dfs右部点
memset(vis,,sizeof vis);
if(dfs(j))ans++;
}
ans=B-ans;
for(int i=;i<=A;i++)
{
tmp=;
memset(pre,,sizeof pre);
memset(out,,sizeof out);
for(int j=;j<=B;j++)if(!sid[i][j])out[j]=,tmp++;//补图上有边
for(int j=;j<=B;j++)
{
if(b[j]%==||out[j])continue;
// if(!sid[i][j]){tmp++; continue;}
memset(vis,,sizeof vis);
if(dfs(j))tmp++;
}
tmp=B-tmp+;
ans=max(ans,tmp);
}
for(int i=;i<=A;i++)
{
// int i=a1[ii];
if(a[i]%==)continue;
for(int j=;j<=A;j++)
{
if(a[j]%==)continue;
// int j=a2[jj];
tmp=;
memset(pre,,sizeof pre);
memset(out,,sizeof out);
for(int k=;k<=B;k++)if(!sid[i][j]||!sid[j][k])out[j]=,tmp++;//!
for(int k=;k<=B;k++)
{
if(b[k]%==||out[k])continue;//补图上有边
memset(vis,,sizeof vis);
if(dfs(k))tmp++;
}
tmp=B-tmp+;
ans=max(ans,tmp);
}
}
printf("%d\n",ans);
return ;
}

bzoj2744 [HEOI2012]朋友圈——二分图匹配的更多相关文章

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

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

  2. BZOJ2744 HEOI2012朋友圈(二分图匹配)

    先考虑B国.容易发现a xor b mod 2=0即二进制末位相同,那么可以据此将所有人分成两部分,每一部分各自是一个完全图.然后再将a or b有奇数个1的边连上,现在需要求的就是这样一个图里的最大 ...

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

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

  4. BZOJ2744: [HEOI2012]朋友圈

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

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

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

  6. 【二分图】HEOI2012 朋友圈

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

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

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

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

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

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

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

随机推荐

  1. 08Java Server Pages 语法

    Java Server Pages 语法 基础语法 注释 <!--   -->可以在客户端通过源代码看到:<%--   --%>在客户端通过查看源代码看不到. <!--浏 ...

  2. Eigen库笔记整理(一)

    首先熟悉Eigen库的用途,自行百度. 引入头文件: // Eigen 部分 #include <Eigen/Core> // 稠密矩阵的代数运算(逆,特征值等) #include < ...

  3. 第一节:重写(new)、覆写(overwrite)、和重载(overload)

    一丶重写<NEW> 子类重写父类方法,方法里加new, eg: public new void CommonMethord1(string msg){} 子类继承父类中的普通方法,如果在子 ...

  4. API Studio 5.1.2 版本更新:加入全局搜索、支持批量测试API测试用例、读取代码注解生成文档支持Github与码云等

    最近在EOLINKER的开发任务繁重,许久在博客园没有更新产品动态了,经过这些日子,EOLINKER又有了长足的进步,增加了更多易用的功能,比如加入全局搜索.支持批量测试API测试用例.读取代码注解生 ...

  5. Python之TCP编程

    参考原文 廖雪峰Python教程 客户端 我们知道每一条TCP的连接有2个端点,这两个端点叫做套接字socket.如果我们要进行基于TCP的通信必须先创建套接字.在Python中可以这样创建套接字so ...

  6. docker-compose 报错记录

    1.如往常一样对docker-compose.yml配置修改后,docker-compose up -d 后台启动,启动后报错,由原来的done变成了error. 第一反应就是down掉这些容器: d ...

  7. Java对象序列化为什么要使用SerialversionUID

    1.首先谈谈为什么要序列化对象 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通 ...

  8. python爬取豆瓣小组700+话题加回复啦啦啦python open file with a variable name

    需求:爬取豆瓣小组所有话题(话题title,内容,作者,发布时间),及回复(最佳回复,普通回复,回复_回复,翻页回复,0回复) 解决:1. 先爬取小组下,所有的主题链接,通过定位nextpage翻页获 ...

  9. CF441D

    题目大意 给出一个有n个数的序列 求符合 区间各数或起来的数大于区间最大数 的区间的个数 题解 预处理出每个数每一位是0的那位左边最近的1和右边最近的1,用单调栈找出每个最大值所在的区间的左右端点,统 ...

  10. SRAM的简单概念

    CY7C138 版权声明:本文为博主原创文章,未经博主允许不得转载.