如果只有两个物品的话 是一个裸的二分图匹配问题

现在变成了三个物品之间的匹配 则只要在中间加一层节点表示书 再把这层的每个点拆成两个点中间连一条边限制流量 使其只能用一次

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define REP(i, a, b) for(register int i = (a), i##_end_ = (b); i <= i##_end_; ++ i)
#define DREP(i, a, b) for(register int i = (a), i##_end_ = (b); i >= i##_end_; -- i)
#define mem(a, b) memset((a), b, sizeof(a))
int read()
{
int sum = , fg = ; char c = getchar();
while(c < '' || c > '') { if (c == '-') fg = -; c = getchar(); }
while(c >= '' && c <= '') { sum = sum * + c - ''; c = getchar(); }
return sum * fg;
}
#define inf 0x3f3f3f3f
const int maxn = ;
int e,be[maxn], ne[maxn], to[maxn], c[maxn];
int nb, nex, na,m1,m2;
void add(int x, int y, int z)
{
to[e] = y, ne[e] = be[x], be[x] = e;
c[e] = z, e++;
to[e] = x, ne[e] = be[y], be[y] = e;
c[e] = , e++;
}
int d[maxn], end;
bool bfs()
{
queue<int>q;
memset(d,-,sizeof(d));
q.push(end),d[end] = ;
while(!q.empty())
{
int u = q.front(); q.pop();
for(int i = be[u]; i!=-; i = ne[i])
{
int v = to[i];
if(d[v] == - && c[i ^ ])
{
d[v] = d[u] + ;
q.push(v);
}
}
}
return d[]!=-;
}
int dfs(int x,int low)
{
if(x == end || !low)return low;
int ret = ;
for(int i = be[x]; i!=-;i = ne[i])
{
int v = to[i];
if(d[v] == d[x] - )
{
int k = dfs(v,min(low-ret,c[i]));
if(k > )
{
c[i] -= k;
c[i^] += k;
ret+=k;
}
}
}
return ret;
}
int dinic()
{
int ans = ;
while(bfs())
{
int k = dfs(,inf);
if(k>)ans+=k;
}
return ans;
}
int main()
{
memset(be,-,sizeof(be));
nb = read(); nex = read(); na = read();
m1 = read();
REP(i,,m1)
{
int x,y;
x = read(), y = read();
add(y,nex+x,);
}
m2 = read();
REP(i,,m2)
{
int x,y;
x = read(), y = read();
add(nex+nb+x,*nb+nex+y,);
}
end = *nb+nex+na+;
REP(i,,nex) add(,i,);
REP(i,,na) add(*nb+nex+i,end,);
REP(i,,nb) add(nex+i,nex+nb+i,);
printf("%d",dinic());
return ;
}

最新文章

  1. scp 从远程服务器上一下载文件
  2. 一键发布ASP.NET Web安装程序
  3. Java菜鸟学习 Script 脚本语言(简介)
  4. 周赛-Killing Monsters 分类: 比赛 2015-08-02 09:45 3人阅读 评论(0) 收藏
  5. 6、网页制作Dreamweaver(HTML结构--dom操作)
  6. 图标的使用————JAVA——Swing
  7. 备忘&#183;添加SublimeText3右键菜单
  8. java实现文件夹(包括其中的子文件夹、子文件)的复制——递归
  9. Inno Setup入门(十五)&mdash;&mdash;Inno Setup类参考(1)
  10. HashSet TreeSet 源码
  11. MySQL在字段中使用select子查询
  12. js 深入理解原型模式
  13. Bug的严重等级和优先级别与分类
  14. git 取消对某个文件的跟踪
  15. hibernate框架学习之数据抓取(加载)策略helloworld
  16. Reservoir sampling
  17. Python Tornado搭建高并发Restful API接口服务
  18. spring cloud 各子项目作用
  19. For循环语句解析
  20. (并查集 建立关系)Parity game -- POJ -1733

热门文章

  1. mysql写存储过程根据时间变化增加工龄
  2. 【编程开发】CMake相关注意事项
  3. MySql中的count、NULL和空串的区别
  4. Springboot 使用Jwt token失效时接口无响应(乌龙)
  5. sort(()=&gt;{return Math.random()-0.5)}乱序数组不准确
  6. [转] Slf4j MDC机制
  7. Spark Scala当中reduceByKey的用法
  8. javaweb中关于转发与重定向的写法
  9. javaweb配置连接mysql数据库
  10. ObjectMapper 对象和json相互转换