#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int maxn=;
const int oo=;
int n,m,c;
int ans=;
int g[][];
int gf[][];
int a[maxn],b[maxn]; struct Edge{
int from,to,cap,flow;
};
vector<int>G[maxn];
vector<Edge>edges;
void Addedge(int x,int y,int z){
Edge e;
e.from=x;e.to=y;e.cap=z;e.flow=;
edges.push_back(e);
e.from=y;e.to=x;e.cap=;e.flow=;
edges.push_back(e);
int cc=edges.size();
G[x].push_back(cc-);
G[y].push_back(cc-);
} int s,t;
int vis[maxn];
int d[maxn];
queue<int>q;
int Bfs(){
memset(vis,,sizeof(vis));
vis[s]=;d[s]=;q.push(s);
while(!q.empty()){
int x=q.front();q.pop();
for(int i=;i<G[x].size();++i){
Edge e=edges[G[x][i]];
if((!vis[e.to])&&(e.cap>e.flow)){
d[e.to]=d[x]+;
vis[e.to]=;
q.push(e.to);
}
}
}
return vis[t];
} int cur[maxn];
int Dfs(int x,int a){
if((x==t)||(a==))return a; int nowflow=,f=;
for(int i=cur[x];i<G[x].size();++i){
cur[x]=i;
Edge e=edges[G[x][i]];
if((d[x]+==d[e.to])&&((f=Dfs(e.to,min(a,e.cap-e.flow)))>)){
nowflow+=f;
a-=f;
edges[G[x][i]].flow+=f;
edges[G[x][i]^].flow-=f;
if(a==)break;
}
}
return nowflow;
} int Maxflow(){
int flow=;
while(Bfs()){
memset(cur,,sizeof(cur));
flow+=Dfs(s,oo);
}
return flow;
} void Dinicinit(){
} int Getsize(int x){
int ret=;
while(x){
++ret;
x^=(x&(-x));
}
return ret;
} int main(){
scanf("%d%d%d",&n,&m,&c);
for(int i=;i<=n;++i)scanf("%d",&a[i]);
for(int i=;i<=m;++i)scanf("%d",&b[i]);
while(c--){
int x,y;
scanf("%d%d",&x,&y);
g[x][y]=;
}
for(int i=;i<=m;++i){
for(int j=;j<=m;++j){
if(i==j)continue;
if(Getsize(b[i]|b[j])%)g[i][j]=;
}
} s=n+m+;t=s+;
for(int i=;i<=n;++i){
for(int j=i;j<=n;++j){
if(!((a[i]^a[j])&))continue;
Dinicinit();
for(int k=;k<=m;++k){
if((!g[i][k])||(!g[j][k]))continue;
if(k%)Addedge(s,k,);
else Addedge(k,t,);
}
for(int x=;x<=m;++x){
if(b[x]%==)continue;
for(int y=;y<=m;++y){
if(b[x]%)continue;
if(!g[x][y])Addedge(x,y,);
}
}
int flow=Maxflow();
ans=max(ans,m-flow+-(i==j));
}
}
Dinicinit();
for(int i=;i<=m;++i){
if(b[i]%)Addedge(s,i,);
else Addedge(i,t,);
}
for(int i=;i<=m;++i){
if(b[i]%==)continue;
for(int j=;j<=m;++j){
if(b[j]%)continue;
if(!g[i][j])Addedge(i,j,);
}
}
ans=max(ans,m-Maxflow());
cout<<ans<<endl;
return ;
}

#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<queue>using namespace std;const int maxn=4000;const int oo=1000000000;int n,m,c;int ans=0;int g[1001][1001];int gf[1001][1001];int a[maxn],b[maxn];
struct Edge{int from,to,cap,flow;};vector<int>G[maxn];vector<Edge>edges;void Addedge(int x,int y,int z){Edge e;e.from=x;e.to=y;e.cap=z;e.flow=0;edges.push_back(e);e.from=y;e.to=x;e.cap=0;e.flow=0;edges.push_back(e);int cc=edges.size();G[x].push_back(cc-2);G[y].push_back(cc-1);}
int s,t;int vis[maxn];int d[maxn];queue<int>q;int Bfs(){memset(vis,0,sizeof(vis));vis[s]=1;d[s]=0;q.push(s);while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<G[x].size();++i){Edge e=edges[G[x][i]];if((!vis[e.to])&&(e.cap>e.flow)){d[e.to]=d[x]+1;vis[e.to]=1;q.push(e.to);}}}return vis[t];}
int cur[maxn];int Dfs(int x,int a){if((x==t)||(a==0))return a;int nowflow=0,f=0;for(int i=cur[x];i<G[x].size();++i){cur[x]=i;Edge e=edges[G[x][i]];if((d[x]+1==d[e.to])&&((f=Dfs(e.to,min(a,e.cap-e.flow)))>0)){nowflow+=f;a-=f;edges[G[x][i]].flow+=f;edges[G[x][i]^1].flow-=f;if(a==0)break;}}return nowflow;}
int Maxflow(){int flow=0;while(Bfs()){memset(cur,0,sizeof(cur));flow+=Dfs(s,oo);}return flow;}
void Dinicinit(){}
int Getsize(int x){int ret=0;while(x){++ret;x^=(x&(-x));}return ret;}
int main(){scanf("%d%d%d",&n,&m,&c);for(int i=1;i<=n;++i)scanf("%d",&a[i]);for(int i=1;i<=m;++i)scanf("%d",&b[i]);while(c--){int x,y;scanf("%d%d",&x,&y);g[x][y]=1;}for(int i=1;i<=m;++i){for(int j=1;j<=m;++j){if(i==j)continue;if(Getsize(b[i]|b[j])%2)g[i][j]=1;}}s=n+m+1;t=s+1;for(int i=1;i<=n;++i){for(int j=i;j<=n;++j){if(!((a[i]^a[j])&1))continue;Dinicinit();for(int k=1;k<=m;++k){if((!g[i][k])||(!g[j][k]))continue;if(k%2)Addedge(s,k,1);else Addedge(k,t,1);}for(int x=1;x<=m;++x){if(b[x]%2==0)continue;for(int y=1;y<=m;++y){if(b[x]%2)continue;if(!g[x][y])Addedge(x,y,1);}}int flow=Maxflow();ans=max(ans,m-flow+2-(i==j));}}Dinicinit();for(int i=1;i<=m;++i){if(b[i]%2)Addedge(s,i,1);else Addedge(i,t,1);}for(int i=1;i<=m;++i){if(b[i]%2==0)continue;for(int j=1;j<=m;++j){if(b[j]%2)continue;if(!g[i][j])Addedge(i,j,1);}}ans=max(ans,m-Maxflow());cout<<ans<<endl;return 0;}

BZOJ 2744的更多相关文章

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

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

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

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

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

  6. 【BZOJ 2744】【HEOI2012】朋友圈

    题目链接: TP 题解: 对于A国,我们发现,最大团一定不大于2.对于B国,发现同奇偶性点之间都有边,不同奇偶性之间可能有边,也就是说对于B国是一个二分图最大团,也就是求B国补图的二分图最大独立集.然 ...

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

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

  8. 【BZOJ 2744 朋友圈】

    Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1570  Solved: 532[Submit][Status][Discuss] Descripti ...

  9. BZOJ - 2744 朋友圈 (二分图上的最大团)

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

  10. bzoj 2744 朋友圈

    题目大意: 两个国家 各有A和B个人,每个人有一个数值. 若两个A国的人满足$val_i\space xor \space val_j \mod 2 =1$ 则他们为朋友 若两个B国的人满足$val_ ...

随机推荐

  1. JAVA版StarDict星际译王简单实现

    由胡正开发的星际译王是Linux平台上很强大的一个开源的翻译软件(也有Windows版本的)支持多种词库.多种语言版本.尤其词库设计比较合理.之前看到一篇博文<星际译王词库应用-自制英汉词典&g ...

  2. Xcode下载途径

    Xcode除了能在Appstore直接下载外,还可以用开发者账号登陆开发者中心[https://developer.apple.com/download/]下载对应的资源. 在开发者中心下载的好处是, ...

  3. 十六 Spring的JDBC模版入门,默认连接池

    Spring是EE开发一站式框架,有EE开发的每层的解决方案,Spring对持久层也提供了解决方案:ORM模块和JDBC的模版

  4. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:表示一个危险动作的按钮操作

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. Python学习笔记之基础篇(五)字典

    #数据类型划分:可变数据类型 不可变数据类型 #不可变数据类型 : 元组 bool int str --> 可哈希 #可变数据类型 list ,dict set --->不可哈希 ''' ...

  6. burpsuite下载安装及基本配置

    jdk安装 根据电脑安装对应jdk版本 点此下载jdk 下载完成得到如下exe文件 配置Java环境变量 计算机右键-->属性-->高级系统设置-->环境变量 点击环境变量--> ...

  7. Keras入门——(4)长短期记忆网络LSTM(一)

    参考: https://blog.csdn.net/zwqjoy/article/details/80493341 https://blog.csdn.net/u012735708/article/d ...

  8. 第二章:windows下搭建开发环境

    IDE ---- pycharm数据库 --- mysql.redis.elasticsearch开发环境 -- anaconda 第一节:pycharm的安装和简单使用...(网上一搜一大堆,所以没 ...

  9. 【Android】在程序中使用触力反馈

    触力反馈又名:hapticFeedbackEnabled 一般有两种实现方式 第一种是在XML布局文件里面设置 android:hapticFeedbackEnabled="true&quo ...

  10. MySQL 加密 压缩

    许多MySQL加密和压缩函数返回结果可能包含任意字节值的字符串,如果要存储这些结果,请使用VARBINARY或BLOB二进制字符串数据类型.这将避免使用非二进制字符串数据类型(CHAR, VARCHA ...