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

求最大的团<==>补图(有边的变成没边、没边的变成有边)的最大独立集!

A国的奇数和偶数变成两个团,B国变成一个二分图,A国和B国之间还有一些任意的边。

B国的部分肯定是求最大独立集。A国呢?A、B国的选点会互相影响。

其实枚举A国的选点情况就行了!每次把相关的B国点删掉,跑匈牙利。

观察数据范围,还专门分成两部分,一看就是一些复杂度在A国点上、一些复杂度在B国点上嘛!

思路。要敢于想补图。要能想到一些稍微暴力一点的方法,如枚举,而不是钻研如何权衡A国B国的选点情况什么的(==要回算时间复杂度)。

1A还是极好的。

时间复杂度玄学。不过匈牙利原来是边越多跑得越快呀。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=,M=;
int T,n,m,c,pos[N],cos[M],b[M],hd[N],xnt,p0,p1,c0,c1,ans,cnt,per[M];
bool bf[M][M],af[N][M],qx[M],vis[M];
struct Ed{
int nxt,to;Ed(int n=,int t=):nxt(n),to(t) {}
}ed[N*M];
void add(int x,int y)
{
ed[++xnt]=Ed(hd[x],y);hd[x]=xnt;
}
bool check(int i,int j)
{
int k=(b[i]|b[j]),ct=;
while(k)k-=(k&-k),ct++;
return ct&;
}
bool dfs(int a)
{
for(int i=c1;i<=m;i++)
if(bf[a][i]&&!qx[i]&&!vis[i])
{
vis[i]=;
if(!per[i]||dfs(per[i]))
{
per[i]=a;return true;
}
}
return false;
}
int xyl()
{
int ret=;memset(per,,sizeof per);
for(int i=;i<=c0;i++)
if(!qx[i]){
memset(vis,,sizeof vis);
if(dfs(i))ret++;
}
return ret;
}
void solve()
{
for(int i=;i<=p0;i++)
for(int j=p1;j<=n;j++)
{
memset(qx,,sizeof qx);
for(int k=hd[i];k;k=ed[k].nxt)qx[ed[k].to]=;
for(int k=hd[j];k;k=ed[k].nxt)qx[ed[k].to]=;
cnt=;for(int i=;i<=m;i++)if(!qx[i])cnt++;
cnt-=xyl();ans=max(ans,cnt+);
}
for(int i=;i<=n;i++)
{
memset(qx,,sizeof qx);
for(int k=hd[i];k;k=ed[k].nxt)qx[ed[k].to]=;
cnt=;for(int i=;i<=m;i++)if(!qx[i])cnt++;
cnt-=xyl();ans=max(ans,cnt+);
}
memset(qx,,sizeof qx);cnt=m;
cnt-=xyl();ans=max(ans,cnt);
}
int main()
{
// scanf("%d",&T);
// while(T--)
// {
memset(hd,,sizeof hd);xnt=;ans=;
memset(bf,true,sizeof bf);memset(af,,sizeof af);
scanf("%d%d%d",&n,&m,&c);p0=;p1=n+;int x,y;
for(int i=;i<=n;i++)
{
scanf("%d",&x);
if(x&)pos[i]=++p0;
else pos[i]=--p1;
}
c0=;c1=m+;
for(int i=;i<=m;i++)
{
scanf("%d",&b[i]);
if(b[i]&)cos[i]=++c0;
else cos[i]=--c1;
for(int j=;j<i;j++)
if(check(i,j))bf[cos[i]][cos[j]]=bf[cos[j]][cos[i]]=;
}
while(c--)
{
scanf("%d%d",&x,&y);
af[pos[x]][cos[y]]=;
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(!af[i][j])add(i,j);
solve();printf("%d\n",ans);
// }
return ;
}

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]朋友圈

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

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

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

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

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

  6. 【二分图】HEOI2012 朋友圈

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

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

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

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

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

  9. BZOJ 3168 Heoi2013 钙铁锌硒维生素 矩阵求逆+匈牙利算法

    题目大意:给定一个n∗n的满秩矩阵A和一个n∗n的矩阵B.求一个字典序最小的1...n的排列a满足将随意一个Ai换成Bai后矩阵A仍然满秩 我们考虑建立一个二分图.假设Ai能换成Bj.就在i−> ...

随机推荐

  1. P4299 首都

    题目 P4299 首都 做法 这题是动态维护树的重心,连边后找到两棵树的重心拉一条链(性质:新重心在链上),然后暴力爬 要注意: 1.是找重心的过程中要先把旋转标记放下来,因为\(Splay(x)\) ...

  2. 移动端tap或touch类型事件的点透问题认识

    1.什么是点透? 举例说明:下图B元素是黄色方块,B元素中包含了C元素,C元素是一个a链接,本身自带click事件按,然后又一个半透明的粉色元素A遮盖在B元素上(看图中A元素是覆盖在B元素上的,不然B ...

  3. jenkins tomcat

    tomcat增加用户配置: <role rolename="tomcat"/> <role rolename="role1"/> < ...

  4. streambase一些疑难杂症

    1.webserverReqest控件接收不到换行符\r\n 方案一:这个在streambase7.6.7没有办法处理,只有在streambase7.7.4中才有办法处理,在这个版本中出现了Reque ...

  5. 報錯:One or more validation errors were detected during model generation:System.Data.Edm.EdmEntityType: : EntityType 'Movie' has no key

    報錯:One or more validation errors were detected during model generation:System.Data.Edm.EdmEntityType ...

  6. VC数据类型

    不同编码格式下的字符串处理及相互转化: ◆ 大家在编程时经常遇到的数据类型:● Ansi:char.char * .const char *CHAR.(PCHAR.PSTR.LPSTR).LPCSTR ...

  7. neutron 虚拟机网络问题调试

    1. Security Group全部打开,这是最基本的,但是很多人容易忘记 2. 通过界面查看虚拟机的log,也可以在compute节点上查看console.log文件,看看里面是否有DHCP获取I ...

  8. RtlWerpReportException failed with status code :-1073741823

    在release下程序运行总是崩溃:debugView输出了这个崩溃信息, 1. 一开始是release看崩溃,各种二分法找崩溃点,太玄没找到: 2. 终于想到可以调试,我草,调试一下瞬间发现某个cl ...

  9. Codeforces 888D Almost Identity Permutations:错排公式

    题目链接:http://codeforces.com/problemset/problem/888/D 题意: 给定n,k,问你有多少种1到n的排列,满足至少有n-k个a[i] == i. (4 &l ...

  10. 最实用的 Linux 命令行使用技巧

    我们可能每天都会要使用到很多的 Linux 命令行. 我们也会网络上知晓一些使用它们的小技巧,但是如果我们没有时常来进行练习,就有可能会忘掉怎么去使用它们. 所以我就决定把那些你可能会忘记的小提示和小 ...