题意

给出一个二分图,左边为A集合,右边为B集合,要求把A集合中每一个点染为黑白两色中的一种,B集合中的颜色已定。染色后对于原本相邻且颜色相同的点,建立新的二分图,即得到了两个新的二分图,它们是独立的。求出这两个新的二分图的最大匹配数的和的最小值。数均小于等于5000。


思考

这是简化题意。由于暴力很难写,考虑网络流。将B集合中的每一个点根据其颜色分为一类和二类点。对于A集合中的每一个点,拆成两个点,两点连1的单向边,将所有相邻的一类点连线左边,另一类连向右边,值为1。所有二类点连向汇点,源点连向所有一类点。最小割。

这样,若割掉了某条边,代表了将某个点相邻的所有A集合中的点都染成了相同的颜色,并断绝了其他点的后路。


代码

 #include<bits/stdc++.h>
using namespace std;
const int maxn=1E5+;
const int inf=INT_MAX;
int head[maxn*],size=,n,m,a[maxn],dfn[maxn],S,T,x,y,ans,k;
struct edge{int to,next,w;}E[maxn*];
void add(int u,int v,int w)
{
E[++size].to=v;
E[size].next=head[u];
E[size].w=w;
head[u]=size; E[++size].to=u;
E[size].next=head[v];
E[size].w=;
head[v]=size;
}
bool bfs()
{
queue<int>Q;
for(int i=;i<=T;++i)dfn[i]=-;
dfn[S]=;
Q.push(S);
while(Q.size())
{
int u=Q.front();
Q.pop();
for(int i=head[u];i;i=E[i].next)
{
int v=E[i].to;
if(E[i].w==||dfn[v]!=-)continue;
dfn[v]=dfn[u]+;
Q.push(v);
}
}
return dfn[T]!=-;
}
int dinic(int u,int up)
{
if(u==T)return up;
int sum=;
for(int i=head[u];i;i=E[i].next)
{
int v=E[i].to;
if(E[i].w==||dfn[v]!=dfn[u]+)continue;
int g=dinic(v,min(E[i].w,up-sum));
E[i].w-=g;
E[i^].w+=g;
sum+=g;
if(g==)dfn[v]=-;
if(sum==up)break;
}
return sum;
}
int main()
{
// freopen("deadline.in","r",stdin);
// freopen("deadline.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n>>m>>k;
for(int i=;i<=n;++i)cin>>a[i];
for(int i=;i<=k;++i)
{
cin>>x>>y;
if(a[x])add(x,y+n,inf);
else add(y+n+m,x,inf);
}
S=;
T=n+m*+;
for(int i=;i<=m;++i)add(i+n,i+n+m,);
for(int i=;i<=n;++i)
if(a[i])add(S,i,);
else add(i,T,);
while(bfs())ans+=dinic(S,inf);
cout<<ans<<endl;
return ;
}

最新文章

  1. DVWA安装,ALMP环境搭建以及php版本转换
  2. PHP的两种表单数据提交方式
  3. ref的用法
  4. cursor:pointer
  5. Python学习(2)基本语法
  6. 【原】 twemproxy ketama一致性hash分析
  7. 跨域访问JSONP CORS
  8. java截取url中的值
  9. poj代码搬家啦啦啦
  10. java统计程序运行的时间
  11. C++重载操作符
  12. 【白痴弟弟和你加强应用层】阅读 Develop API Guides 思考(一个)
  13. 数据存储(两)--SAX发动机XML记忆(附Demo)
  14. HTML &lt;select&gt;标签
  15. Samba原理和配置
  16. python:前端(HTML)+后端(Django)+数据库(MySQL)
  17. Oracle存储过程中跳出循环的写法
  18. Centos 忘记root密码怎么办?
  19. StanFord ML 笔记 第十部分
  20. python基础易错总结

热门文章

  1. xslt注入
  2. WxWidgets笔记
  3. CentOS 7 源码搭建LNMP环境
  4. Python 函数中,参数是传值,还是传引用?
  5. shell 三剑客
  6. http返回状态码含义
  7. Eclipse安装svn插件的几种方式(转)
  8. 解决 img 标签上下出现的间隙
  9. opencv计算两个轮廓之间hu矩相似程度,MatchShapes
  10. java 43 接口