题目: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. Android studio 开发一个用户登录界面

    Android studio 开发一个用户登录界面 activity_main.xml <?xml version="1.0" encoding="utf-8&qu ...

  2. JAVA基础——集合Iterator迭代器的实现

    一.迭代器概述 1.什么是迭代器? 在Java中,有很多的数据容器,对于这些的操作有很多的共性.Java采用了迭代器来为各种容器提供了公共的操作接口.这样使得对容器的遍历操作与其具体的底层实现相隔离, ...

  3. [bzoj1005][HNOI2008][明明的烦恼] (高精度+prufer定理)

    Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N ...

  4. Apache Maven Cookbook(八)学习笔记-Handling Typical Build Requirements

    Including and excluding additional resources Using the Maven Help Plugin: mvn help:effective-pom mvn ...

  5. 【Codeforces 300C】Beautiful Numbers

    [链接] 我是链接,点我呀:) [题意] 让你找到长度为n的数字 这个数字只由a或者b组成 且这n个数码的和也是由a或者b组成的 求出满足这样要求的数字的个数 [题解] 枚举答案数字中b的个数为y,那 ...

  6. 0213Zabbix通过percona监控MySQL

    因为Zabbix自带的MySQL监控没有提供可以直接使用的Key,所以一般不采用,业界的同学们都使用Percona Monitoring Plugins 监控 MySQL的方式 Percona介绍 P ...

  7. HDU——2067 小兔的棋盘

    小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  8. MongoDB:最简单的增删改查(Oops,可能太简单了)

    热身运动: 1. 启动MongoDB shell => mongo.exe or ./mongo(先确保有一个mongod的实例): 2. 切换到一个用于练手的namespace => u ...

  9. Java序列化之readObjectNoData、readResolve方法

    Java序列化之readObjectNoData.readResolve方法 学习了:http://vyloy.iteye.com/blog/1240663 readResolve方法会在Object ...

  10. Spring技术内幕:Spring AOP的实现原理(五)

    7.Advice通知的实现 AopProxy代理对象生成时,其拦截器也一并生成.以下我们来分析下Aop是怎样对目标对象进行增强的.在为AopProxy配置拦截器的实现中,有一个取得拦截器配置过程,这个 ...