题目链接:

     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. [ASP.NET MVC4高级编程] 学习记录(一)

    理论: 先有GUI在发展,当用户按下某个键,某个进程会监听到这个动作,这个进程就是控制器.这就是MVC模式. 后来有了事件驱动编程,响应动作的是按钮本身,而不是控制器. 再后来webForm中,事件驱 ...

  2. List非0连续片段的索引

    import pandas as pd import numpy as np l = [0, 11, 23, 33, 0, 0, 0, 76, 0, 41, 68] df = pd.DataFrame ...

  3. Day19 Django

    老师代码博客: http://www.cnblogs.com/yuanchenqi/articles/7552333.html 上节内容回顾: class Book(models.Model): ti ...

  4. nginx for Windows

    zt from nginx official site. Known issuesPossible future enhancements Version of nginx for Windows u ...

  5. JDBC连接数据库时候出错

    错误提示如下: Fri May 13 09:06:04 CST 2016 WARN: Establishing SSL connection without server's identity ver ...

  6. form表单序列化为Jquery对象

    <form id="DailyFinancial" > @*class="form-inline"*@ <div class="fo ...

  7. CF877F

    题目大意:给定n个数有正有负,有Q次询问,每次询问区间[l,r]中有几个子区间满足和为k 做法:显然的莫队 每次用map记录一下当前区间[l,r]中的前缀和的值的个数 然后r的话找sum[r]-k的, ...

  8. leetCode刷题(找出数组里的两项相加等于定值)

    最近被算法虐了一下,刷一下leetcode,找找存在感 如题: Given an array of integers, return indices of the two numbers such t ...

  9. 微信小程序-获取地理位置

    近期公司使用微信小程序开发一套应用,涉及到使用小程序的获取地理位置接口,但是在使用测试过程中发现获取的经纬度偏差较大, 之后进行了一番搜索,终于找到了, 原文地址:http://blog.csdn.n ...

  10. 并发库应用之八 & 循环路障CyclicBarrier应用

    JDK包位置:java.util.concurrent.CyclicBarrier 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及 ...