P1231 教辅的组成 拆点限流
2024-09-25 14:48:50
如果只有两个物品的话 是一个裸的二分图匹配问题
现在变成了三个物品之间的匹配 则只要在中间加一层节点表示书 再把这层的每个点拆成两个点中间连一条边限制流量 使其只能用一次
#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 ;
}
最新文章
- scp 从远程服务器上一下载文件
- 一键发布ASP.NET Web安装程序
- Java菜鸟学习 Script 脚本语言(简介)
- 周赛-Killing Monsters 分类: 比赛 2015-08-02 09:45 3人阅读 评论(0) 收藏
- 6、网页制作Dreamweaver(HTML结构--dom操作)
- 图标的使用————JAVA——Swing
- 备忘&#183;添加SublimeText3右键菜单
- java实现文件夹(包括其中的子文件夹、子文件)的复制——递归
- Inno Setup入门(十五)&mdash;&mdash;Inno Setup类参考(1)
- HashSet TreeSet 源码
- MySQL在字段中使用select子查询
- js 深入理解原型模式
- Bug的严重等级和优先级别与分类
- git 取消对某个文件的跟踪
- hibernate框架学习之数据抓取(加载)策略helloworld
- Reservoir sampling
- Python Tornado搭建高并发Restful API接口服务
- spring cloud 各子项目作用
- For循环语句解析
- (并查集 建立关系)Parity game -- POJ -1733
热门文章
- mysql写存储过程根据时间变化增加工龄
- 【编程开发】CMake相关注意事项
- MySql中的count、NULL和空串的区别
- Springboot 使用Jwt token失效时接口无响应(乌龙)
- sort(()=>;{return Math.random()-0.5)}乱序数组不准确
- [转] Slf4j MDC机制
- Spark Scala当中reduceByKey的用法
- javaweb中关于转发与重定向的写法
- javaweb配置连接mysql数据库
- ObjectMapper 对象和json相互转换