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_ ...
随机推荐
- free to monitor your sqlserver easy and safe and ...
Unlike AWR in Oracle, Sqlserver does not have offical way to make history performance information fo ...
- Codeforces1303D. Fill The Bag
1e18对应2进制有58位,可以直接暴力模拟,因为读入的数都是2次幂,__builtin_ctz这个内置gcc函数可以算出二进制下末尾有几个0,读入时统计,然后从n的最低位开始判断,注意每次升位的时候 ...
- Django学习之ORM练习题
一.表关系 创建表关系,并创建约束 班级表:class 学生表: student cid caption grade_id sid sname gender class_id 1 一年一班 1 1 乔 ...
- spring boot中扩展spring mvc 源码分析
首先,确认你是对spring boot的自动配置相关机制是有了解的,如果不了解请看我spring boot相关的源码分析. 通常的使用方法是继承自org.springframework.boot.au ...
- 学习JNA,Jnative
首先说下JAVA调用DLL,Java调用DLL的常用方法大致为几种,JNI,JNA,Jnative等,但实现与易用性差距还是很大,1.JNI用的人比较多,但相对来说比较麻烦要熟悉c并且要使用javac ...
- Linux系统监控 zabbix-agent 主机添加的操作页面
#!/bin/bash#设置解析#安装zabbix源.aliyun YUM源# rpm -ivh http://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zab ...
- IDEA中maven工程打包时使用跳过test模式
- 103、Java中String类之compareTo()方法
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 前端学习笔记系列一:1.export default / export const
export default 是默认导出 export const 是命名导出 参考:Javascript (ES6), export const vs export default(基本上就是翻译这 ...
- Activemq、Rabbitmq、Rocketmq、Kafka的对比
综上所述,各种对比之后,我个人倾向于是: 一般的业务系统要引入MQ,最早大家都用ActiveMQ,但是现在确实大家用的不多了,没经过大规模吞吐量场景的验证,社区也不是很活跃,所以大家还是算了吧,我个人 ...