博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu1402 酒店之王
阅读量:6435 次
发布时间:2019-06-23

本文共 2097 字,大约阅读时间需要 6 分钟。

\(n\)\(A\) 类节点, \(p\)\(B\) 类节点, \(q\)\(C\) 类节点。每个 \(A\) 与一个 \(B\) 和一个 \(C\) 构成一组匹配(每个 \(A\) 只能与给定的 \(B\)\(C\) 匹配,且每个 \(B\)\(C\)只能匹配一个 \(A\) ),求最大匹配数。

\(n,\ p,\ q\leq100\)

网络流


先建成 \(B\to A,\ A\to C\) 两个二分图匹配,然后中间每个 \(A\) 类节点拆点限制流量并继承。

代码

#include 
using namespace std;const int maxn = 410, maxm = 1e5 + 10, inf = INT_MAX;int N, k1, k2;int S, T, h[maxn], q[maxn], dis[maxn], cur[maxn];struct edges { int nxt, to, w; edges(int x = 0, int y = 0, int z = 0) : nxt(x), to(y), w(z) {}} e[maxm];void addline(int u, int v, int w) { static int cnt = 1; e[++cnt] = edges(h[u], v, w), h[u] = cnt; e[++cnt] = edges(h[v], u, 0), h[v] = cnt;}bool bfs() { memcpy(cur, h, sizeof h); memset(dis, -1, sizeof dis); int l = 1, r = 1; q[1] = S, dis[S] = 0; while (l <= r) { int u = q[l++]; for (int i = h[u]; i; i = e[i].nxt) { int v = e[i].to; if (dis[v] == -1 && e[i].w) { q[++r] = v, dis[v] = dis[u] + 1; if (v == T) return 1; } } } return 0;}int dfs(int u, int f) { if (u == T || !f) { return f; } int res = 0, tmp; for (int& i = cur[u]; i && f; i = e[i].nxt) { int v = e[i].to; if (dis[v] == dis[u] + 1 && e[i].w) { if (!(tmp = dfs(v, min(f, e[i].w)))) { dis[v] = 0; continue; } e[i].w -= tmp, e[i ^ 1].w += tmp, res += tmp, f -= tmp; } } return res;}int dinic() { int res = 0; while (bfs()) { res += dfs(S, inf); } return res;}int main() { scanf("%d %d %d", &N, &k1, &k2); S = N + N + k1 + k2 + 1, T = S + 1; for (int i = 1; i <= k1; i++) { addline(S, i, 1); } for (int i = 1; i <= k2; i++) { addline(N + N + k1 + i, T, 1); } for (int i = 1; i <= N; i++) { addline(k1 + i, N + k1 + i, 1); } for (int i = 1; i <= N; i++) { for (int j = 1, x; j <= k1; j++) { scanf("%d", &x); if (x) addline(j, k1 + i, 1); } } for (int i = 1; i <= N; i++) { for (int j = 1, x; j <= k2; j++) { scanf("%d", &x); if (x) addline(N + k1 + i, N + N + k1 + j, 1); } } printf("%d", dinic()); return 0;}

转载于:https://www.cnblogs.com/Juanzhang/p/10549544.html

你可能感兴趣的文章
Binary search
查看>>
http://jingyan.baidu.com/article/08b6a591f0fafc14a9092275.html
查看>>
MySQL查询数据表的Auto_Increment(自增id)
查看>>
java多线程系类:JUC集合:01之框架
查看>>
【Linux】 源码安装make命令详解,避免踩坑
查看>>
数据库中间表插入乱序
查看>>
[Python爬虫] 之四:Selenium 抓取微博数据
查看>>
使用OPENROWSET爆破SQL Server密码
查看>>
Mac_安装Homebrew以及Maven
查看>>
eclipse web开发Server配置
查看>>
曹政--互联网搜索老师傅
查看>>
MUI框架开发HTML5手机APP(一)--搭建第一个手机APP(转)
查看>>
linux下使用 du查看某个文件或目录占用磁盘空间的大小
查看>>
[wp7软件]wp7~~各种视频播放器下载大全
查看>>
Java工程师必知之事 —— 如何定义自己的职业路线?
查看>>
代码质量与规范,那些年你欠下的技术债
查看>>
计算机程序的思维逻辑 (19) - 接口的本质
查看>>
CVE-2014-4113漏洞利用过程分析
查看>>
解密MSSQL链接数据库的密码
查看>>
Glide-源码详解
查看>>