题目: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. spring aop 方法增加日志记录

    使用场景: 1:调用外部接口时需要记录出参和入参. 2:分布式系统之间,调用各个系统之间需要记录日志,一旦出现了问题也可以找得到元数据 一言不合,上代码: # 枚举类 package xxxxxxxx ...

  2. 【转】Go语言入门教程(一)Linux下安装Go

    说明 系统是Ubuntu. 关于安装 下载安装包 当前官方下载地址是https://golang.org/dl/,如果不能访问,请自行FQ,FQ是技术工作者的必备技能. 安装 tar -xzvf go ...

  3. ios8 UITableView设置 setSeparatorInset:UIEdgeInsetsZero不起作用的解决办法(去掉15px空白间距)

    但是在ios8中,设置setSeparatorInset:UIEdgeInsetsZero 已经不起作用了.下面是解决办法: 首先在viewDidLoad方法加入以下代码: if(leftTable! ...

  4. 诊断:Goldengate OGG-01163 Bad column length

    故障现象: OGG- Bad column length () specified . 原因:源端修改了字段长度.虽然源端和目标端的长度已经通过DDL语句修改到一致,在extract进程未重启的情况下 ...

  5. request在作用域中管理属性

    request在作用域中管理属性 制作人:全心全意 在作用域中管理属性 setAttribute(String name,Object object) name:表示变量名,为String类型,在转发 ...

  6. https报错注销源文件内容

    open -a pycharm /Users/vivi/Library/Python/3.6/lib/python/site-packages/requests/packages/urllib3/co ...

  7. pxc增量恢复

    解流 xbstream -x < fullbackup2.xbstream -C /data/fullbackup xbstream -x < fullbackup2.xbstream - ...

  8. PAT 1126 Eulerian Path

    In graph theory, an Eulerian path is a path in a graph which visits every edge exactly once. Similar ...

  9. 解决ASP.NET Core部署到IIS,更新项目"另一个程序正在使用此文件,进程无法访问"

    问题:部署到IIS上的ASP.NET Core项目,在更新的时候会进程占用的错误 初步解决方案: 1,关闭应用程序池 2,关闭网站 3,更新项目 缺点:网站没法访问,部署项目停的时间过长 查询官方文档 ...

  10. HXY烧情侣(洛谷 2194)

    题目描述 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里有n座电影院,n对情侣分别在每座电影院里,然后电影院里都有汽油,但是要 ...