POJ3281 Dining(拆点构图 + 最大流)
2016-04-19 19:41
281 查看
题目链接
题意:有F种食物,D种饮料N头奶牛,只能吃某种食物和饮料(而且只能吃特定的一份)
一种食物被一头牛吃了之后,其余牛就不能吃了
第一行有N,F,D三个整数
接着2-N+1行代表第i头牛,前面两个整数是Fi与Di(食物与饮料的种类数量),接着是食物的种类与饮料的种类
要求输出最多分配能够满足的牛的数量
参考北理大神博客
分析:本想最大匹配搞,然后发现牛不仅要匹配食物还要匹配饮料。
最大流拆点构图, 食物 - 牛- 饮料,但是由于一个牛只能选择一个食物和一个饮料,也就是说牛这个节点有限制,最大就是1,然后把 牛这个节点拆成 牛 - 牛 其中之间流量是1,
于是 最后模型就是 食物 - 牛 - 牛 - 饮料 节点之间的流量都是1.
View Code
题意:有F种食物,D种饮料N头奶牛,只能吃某种食物和饮料(而且只能吃特定的一份)
一种食物被一头牛吃了之后,其余牛就不能吃了
第一行有N,F,D三个整数
接着2-N+1行代表第i头牛,前面两个整数是Fi与Di(食物与饮料的种类数量),接着是食物的种类与饮料的种类
要求输出最多分配能够满足的牛的数量
参考北理大神博客
分析:本想最大匹配搞,然后发现牛不仅要匹配食物还要匹配饮料。
最大流拆点构图, 食物 - 牛- 饮料,但是由于一个牛只能选择一个食物和一个饮料,也就是说牛这个节点有限制,最大就是1,然后把 牛这个节点拆成 牛 - 牛 其中之间流量是1,
于是 最后模型就是 食物 - 牛 - 牛 - 饮料 节点之间的流量都是1.
#include <iostream> #include <cstdio> #include <algorithm> #include <queue> #include <cstring> using namespace std; const int Max = 500; const int INF = 0x3f3f3f3f; int g[Max][Max]; int N, F, D; int pre[Max]; int BFS() { memset(pre, -1, sizeof(pre)); int MinFlow = INF; queue<int> que; pre[0] = 0; que.push(0); int des = F + 2 * N + D + 1; while (!que.empty()) { int x = que.front(); que.pop(); if (x == des) break; for (int i = 1; i <= des; i++) { if (pre[i] == -1 && g[x][i]) { if (MinFlow > g[x][i]) { MinFlow = g[x][i]; } pre[i] = x; que.push(i); } } } if (pre[des] == -1) return -1; return MinFlow; } void EK() { int MaxFlow = 0, inFlow = 0, des; while ( (inFlow = BFS()) != -1) { MaxFlow += inFlow; des = F + 2 * N + D + 1; while (des != 0) { g[des][pre[des]] += inFlow; g[pre[des]][des] -= inFlow; des = pre[des]; } } printf("%d\n", MaxFlow); } void buildGraph() { while (scanf("%d%d%d", &N, &F, &D) != EOF) { memset(g, 0, sizeof(g)); int fd, fnum, dnum; for (int i = 1; i <= N; i++) { scanf("%d%d", &fnum, &dnum); for (int j = 0; j < fnum; j++) { scanf("%d", &fd); g[0][fd] = 1; // 0点作为起点连接每个食物 g[fd][F + i] = 1; // 食物和牛相连,食物最大F, } g[F + i][F + N + i] = 1; // 牛 和 牛相连 for (int j = 1; j <= dnum; j++) { scanf("%d", &fd); g[F + N + i][F + N + N + fd] = 1; // 牛和饮料相连 g[F + N + N + fd][F + N + N + D + 1] = 1; // 设一个终点让每一个 饮料 和他相连,流量为1 } } EK(); } } int main() { buildGraph(); return 0; }
View Code
相关文章推荐
- KMP模板代码
- hihocoder #1170 机器人 && 编程之美2015复赛
- Windows Server 2008 R2安装配置WEB服务器
- 自定义配置文件
- UDP笔记
- 【算法学习】KMP查找匹配字符串
- matlab tensor toolbox 实现HOSVD(高阶奇异值分解)推荐系统
- 在进程间切换文件描述符
- FZU 1911 Construct a Matrix
- 信息化给予我的感受
- 冲刺第一天
- 在WebApi中基于Owin OAuth使用授权发放Token
- POJ 2288 Islands and Bridges
- 数据结构和算法15 之二叉树排序
- LeetCode Sum Root to Leaf Numbers
- struts2的工作原理和相关文件的介绍
- 软件项目管理(二)——用jenkins持续集成、Maven、Github的使用
- androidstudio 问题
- hihoCoder--1268--九宫(全排列)
- js设置form的onsubmit事件