bzoj 2744 朋友圈
题目大意:
两个国家 各有A和B个人,每个人有一个数值。
若两个A国的人满足$val_i\space xor \space val_j \mod 2 =1$ 则他们为朋友
若两个B国的人满足$val_i\space xor \space val_j \mod 2 =0$或者二进制下$val_i \space or\space val_j$中有奇数个1 则他们为朋友
给出一些A国的人与B国的人的朋友关系
求图的最大团
思路:
直接求最大团并不好求,发现A国的人最多取2个
而B国形成的图的反图一定为二分图(奇偶相连),而二分图反图的最大团=最大点独立集=$n-$最大匹配
因此我们先建出B国的反图,枚举选A国的人的情况,对每种情况在图上打$tag$ 跑$Dinic$即可
(完全忘记匈牙利.jpg
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<set>
#define ll long long
#define db double
#define inf 2139062143
#define MAXN 3010
#define MAXM 5001000
#define rep(i,s,t) for(register int i=(s),i##__end=(t);i<=i##__end;++i)
#define dwn(i,s,t) for(register int i=(s),i##__end=(t);i>=i##__end;--i)
#define ren for(register int i=fst[x];i;i=nxt[i])
#define pb(i,x) vec[i].push_back(x)
#define pls(a,b) (a+b)%MOD
#define mns(a,b) (a-b+MOD)%MOD
#define mul(a,b) (1LL*(a)*(b))%MOD
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int na,nb,m,ans,S,T,a[],b[MAXN],t1,t2;vector<int> vec[];
struct Dinic
{
int S,T,fst[MAXN],nxt[MAXM<<],to[MAXM<<],val[MAXM<<],cnt,cur[MAXN];
int vis[MAXN],dis[MAXN],tot,q[MAXN],l,r,o1[MAXN],o2[MAXN];
Dinic(){memset(fst,,sizeof(fst));cnt=;}
void add(int u,int v,int w) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v,val[cnt]=w;}
void ins(int u,int v,int w) {add(u,v,w);add(v,u,);}
int bfs()
{
q[l=r=]=T,vis[T]=++tot,dis[T]=;int x;
while(l<=r)
{
x=q[l++];ren if(o1[to[i]]==t1&&o2[to[i]]==t2&&vis[to[i]]!=tot&&val[i^])
dis[to[i]]=dis[x]+,vis[to[i]]=tot,q[++r]=to[i];
}
return vis[S]==tot;
}
int dfs(int x,int a)
{
if(x==T||!a) return a;int flw=,f;
for(int& i=cur[x];i&&a;i=nxt[i])
if(dis[to[i]]==dis[x]-&&val[i]&&(f=dfs(to[i],min(a,val[i]))))
a-=f,flw+=f,val[i]-=f,val[i^]+=f;
return flw;
}
int solve(int _s,int _t,int res=)
{
S=_s,T=_t;int f;while(bfs())
{rep(i,,max(S,T)) cur[i]=fst[i];while(f=dfs(S,inf)) res+=f;}
return res;
}
}D;
int lowbit(int x) {return x&(-x);}
int cheq(int x,int res=) {for(;x;x-=lowbit(x)) res++;return !(res&);}
int vis[MAXN],vis2[MAXN];
int main()
{
na=read(),nb=read(),m=read();int x,y,sum;S=nb+,T=S+;
rep(i,,na) a[i]=read();rep(i,,nb) b[i]=read();
while(m--) x=read(),y=read(),pb(x,y);
rep(i,,nb) if(b[i]&) D.ins(S,i,);
else {D.ins(i,T,);rep(j,,nb) if((b[j]&)&&cheq(b[i]|b[j])) D.ins(j,i,);}
rep(i,,na) pb(i,S),pb(i,T);
ans=max(ans,nb-D.solve(S,T));D.solve(T,S);
rep(i,,na)
{
sum=-;rep(x,,vec[i].size()-) D.o1[vec[i][x]]=i,sum++;
t1=i,ans=max(ans,sum+-D.solve(S,T));D.solve(T,S);
}
rep(i,,na) if(a[i]&)
{
rep(x,,vec[i].size()-) D.o1[vec[i][x]]=i+na;t1=i+na,sum=-;
rep(j,i+,na) if(!(a[j]&))
{
rep(x,,vec[j].size()-) D.o2[vec[j][x]]=i*na+j,sum+=(D.o1[vec[j][x]]==t1);
t2=i*na+j;ans=max(ans,sum+-D.solve(S,T));D.solve(T,S);sum=-;
}
}
printf("%d",ans);
}
bzoj 2744 朋友圈的更多相关文章
- 【BZOJ 2744 朋友圈】
Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1570 Solved: 532[Submit][Status][Discuss] Descripti ...
- 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]朋友圈
Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...
- 【刷题】BZOJ 2744 [HEOI2012]朋友圈
Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...
- QQ空间/朋友圈类界面的搭建
类似于QQ空间的布局主要是在说说信息.点赞.回复三大部分的自适应布局上. 当我们需要搭建类似QQ空间.微信朋友圈的界面的时候,可做如下操作: 创建一个对应的model类: 创建一个对应model类的f ...
- Python微信-- 分享接口(分享到朋友圈、朋友、空间)
生成JS-SDK权限验证的签名 获取signature(签名)首先要获得 1.#获得jsapi_ticket 2.#获取当前页面的url #获取当前页面的url url="{}://{}{} ...
- Apple Watch版微信来了 收发微信刷朋友圈不在话下
昨晚果粉守了一夜的Apple Watch发布会,意料中的惊喜不少,最让人兴奋的是微信成为首批支持的应用.是的,在全球拥有4.68亿月活跃用户的微信怎么可能不第一时间入驻呢?之前我们就有聊过Apple ...
随机推荐
- Sql Server数据库视图的创建、修改
if OBJECT_ID('Sales.USACusts') is not null drop view Sales.USACusts; go create view Sales.USACusts a ...
- POJ 2478 欧拉函数打表的运用
http://poj.org/problem?id=2478 此题只是用简单的欧拉函数求每一个数的互质数的值会超时,因为要求很多数据的欧拉函数值,所以选用欧拉函数打表法. PS:因为最后得到的结果会很 ...
- 【板+背包】多重背包 HDU Coins
http://acm.hdu.edu.cn/showproblem.php?pid=2844 [题意] 给定n种价值为Ci,个数为Wi的硬币,问在1~V中的这些数中哪些数能由这些硬币组成? [思路] ...
- 【HDOJ6343】Graph Theory Homework(贪心)
题意: 给定n个点,每个点有权值a[i],从A走到B的花费是下取整sqrt(a[i]-a[j]),求从1号点走到n号点的最小花费 1<=n,a[i]<=1e5 思路: #include&l ...
- C++常见函数(备忘录)
substr(string的成员函数) 语法: basic_string substr( size_type index, size_type num = npos ); substr()返回本字符串 ...
- 线程&线程池
线程 进程和线程: 进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位. 注意:两个都是过程 线程一个特点: 一个进程中,多个线程共享资源 线程和进程区 ...
- hashlib-sha摘要算法模块
摘要:hashlib: 摘要算法的模块 用处: 1.查看某两个文件是否完全一致 "abcdefggg" "abcdefhhg" 2.加密认证 把密码加密后写入文 ...
- 创建SSH keys
1.检查是否已经有SSH Key存在 windows: type "%userprofile%\.ssh\id_rsa.pub" Linux: cat ~/.ssh/id_rsa. ...
- linux下启动mysql服务(类似于windows下net start mysql)
1.linux系统启动方式:service mysql start.其类似于windows下net start mysql
- 在SUSE12中使用 Machinery 进行高级系统管理
简单介绍 在 SUSE Linux Enterprise 12 中.SUSE 如今推出了面向系统管理员的 Machinery.作为其高级系统管理模块的一部分.Machinery 是适用于 Linux ...