BZOJ 2744
#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的更多相关文章
- bzoj 2744: [HEOI2012]朋友圈 二分图匹配
2744: [HEOI2012]朋友圈 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 612 Solved: 174[Submit][Status] ...
- 【BZOJ 2744】 2744: [HEOI2012]朋友圈 (最大团,二分图匹配,构图)
2744: [HEOI2012]朋友圈 Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他 ...
- bzoj 2744 [HEOI2012]朋友圈——补图!+匈牙利算法
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2744 求最大的团<==>补图(有边的变成没边.没边的变成有边)的最大独立集! A ...
- bzoj 2744: [HEOI2012]朋友圈
#include<cstdio> #include<iostream> #define M 3010 using namespace std; ],u[M*M>>] ...
- 【BZOJ 2744 】[HEOI2012]朋友圈
Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...
- 【BZOJ 2744】【HEOI2012】朋友圈
题目链接: TP 题解: 对于A国,我们发现,最大团一定不大于2.对于B国,发现同奇偶性点之间都有边,不同奇偶性之间可能有边,也就是说对于B国是一个二分图最大团,也就是求B国补图的二分图最大独立集.然 ...
- 【刷题】BZOJ 2744 [HEOI2012]朋友圈
Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...
- 【BZOJ 2744 朋友圈】
Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1570 Solved: 532[Submit][Status][Discuss] Descripti ...
- BZOJ - 2744 朋友圈 (二分图上的最大团)
[题目大意] 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大数目.两 ...
- bzoj 2744 朋友圈
题目大意: 两个国家 各有A和B个人,每个人有一个数值. 若两个A国的人满足$val_i\space xor \space val_j \mod 2 =1$ 则他们为朋友 若两个B国的人满足$val_ ...
随机推荐
- 2019上海爱奇艺大数据Java实习生-面试记录
目录 一轮 电话面试 二轮 代码笔试 三轮 技术面试 总结 附:电话面试问题点解惑 补充:面试未通过 一轮 电话面试 2019.04.28 16:21 [w]:面试官,[m]:我,下面的内容来自电话录 ...
- Write-up-CH4INRULZ_v1.0.1
关于 下载地址:点我 哔哩哔哩:哔哩哔哩 信息收集 网卡:vboxnet0,192.168.56.1/24,Nmap扫存活主机发现IP为192.168.56.101 ➜ ~ nmap -sn 192. ...
- BigDecimal类用于计算(不会丢失精度)
- C# FileStream 对象的Seek()方法-----转载
原创 kevin617 发布于2010-12-08 11:22:00 阅读数 8630 收藏展开 FileStream 可以随机读写文件 使用 Seek 方法 Seek() ----------有两 ...
- Dockfile的详解
Dockerfile是构建镜像的指令文件,按照dockerfile的规范分为如下几部分: FROM 基础镜像,FROM alpine:3.8(任何的一个镜像都可以作为基础镜像,主要看我们做的镜像是干嘛 ...
- Vue二次精度随笔(1)
1.button.input标签的disabled属性 该标签可以控制按钮是否可用,如果他的值为以上几种的话,则他都不会在标签上渲染出这个属性,一旦这个属性出现的话,就说明他是禁用的 2.移除动态绑定 ...
- Python 2 与 3 共存了 11 年,新年就要和它道别
在 Python 3.9 都已经进入 dev 版本的 2020 年,Python 2 终于要和我们告别了. 2 and 3 Python 2 第一个版本发布于 2000 年 10 月 16 日,到今年 ...
- Commons BeanUtils 中对Map的操作
CSDN学院招募微信小程序讲师啦 程序员简历优化指南! [观点]移动原生App开发 PK HTML 5开发 云端应用征文大赛,秀绝招,赢无人机! Commons BeanUtils 中对Map的操作 ...
- js学习(三)对象与事件
JavaScript 对象 1.JavaScript 对象:拥有属性和方法的数据. 2.在 JavaScript中,几乎所有的事物都是对象. 3.定义一个person对象 var person = { ...
- 免费的 Linux 分区管理器使用介绍
下面的列表没有特定的排名顺序.大多数分区工具应该存在于 Linux 发行版的仓库中. GParted 这可能是 Linux 发行版中最流行的基于 GUI 的分区管理器.你可能已在某些发行版中预装它.如 ...