Dining POJ - 3281
题意:
f个食物,d杯饮料,每个牛都有想吃的食物和想喝的饮料,但食物和饮料每个只有一份 求最多能满足多少头牛。。。。
解析:
一道简单的无源汇拆点最大流 无源汇的一个最大流,先建立超级源s和超级汇t, 把s和食物连接 权值为食物的数量1 ,饮料和t连接 权值为饮料的数量1, 因为牛只要一个就好,所以牛的结点容量为1 把牛拆成u和u’ 中间权值为1, 牛和喜欢的食物、饮料分别建边 权值为INF和1都行
这道题和hdu4292 很相似 传送门:https://www.cnblogs.com/WTSRUVF/p/9202751.html
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #define mem(a,b) memset(a, b, sizeof(a)) using namespace std; const int maxn = 100100, INF = 0x7fffffff; int head[maxn], d[maxn], cur[maxn]; int n, m, s, t, F, D; int cnt; typedef long long LL; struct node{int u, v, c, next; }Node[maxn*2];void add_(int u, int v, int c) {Node[cnt].u = u;Node[cnt].v = v;Node[cnt].c = c;Node[cnt].next = head[u];head[u] = cnt++; }void add(int u, int v, int c) {add_(u, v, c);add_(v, u, 0); }bool bfs() {queue<int> Q;mem(d, 0);Q.push(s);d[s] = 1;while(!Q.empty()){int u = Q.front(); Q.pop();for(int i=head[u]; i!=-1; i=Node[i].next){node e = Node[i];if(!d[e.v] && e.c > 0){d[e.v] = d[e.u] + 1;Q.push(e.v);// cout<< e.v << " " << t <<endl;if(e.v == t) return 1;}}}return d[t] != 0; }int dfs(int u, int cap) {if(u == t || cap == 0)return cap;int ret = 0;for(int &i=cur[u]; i!=-1; i=Node[i].next){node e = Node[i];if(d[e.v] == d[e.u] + 1 && e.c > 0){int V = dfs(e.v, min(cap, e.c));Node[i].c -= V;Node[i^1].c += V;cap -= V;ret += V;if(cap == 0) break;}}return ret; }int dinic() {int ans = 0;while(bfs()){// cout<< 2111 <<endl;memcpy(cur, head, sizeof(head));ans += dfs(s, INF);// cout<< ans <<endl; }return ans; }int main() {cnt = 0;mem(head, -1);cin>> n >> F >> D;s = 0, t = F + D + n + n + 1;for(int i=1; i<=F; i++)add(s, i, 1);for(int i=1; i<=D; i++)add(F+i, t, 1);for(int i=1; i<=n; i++)add(F+D+i, F+D+n+i, 1);for(int i=1; i<=n; i++){int r, l;cin>> r >> l;for(int j=0; j<r; j++){int u;cin>> u;add(u, F+D+i, INF);}for(int j=1; j<=l; j++){int v;cin>> v;add(F+D+n+i, F+v, INF);}}cout<< dinic() <<endl;return 0; }
转载于:https://www.cnblogs.com/WTSRUVF/p/9221009.html
Dining POJ - 3281相关推荐
- B - Dining POJ - 3281 -网络流拆点模板
B - Dining POJ - 3281 题意:一些牛,每只牛有 一些 想吃的food and milk,然后问最大能够满足多少只牛. 满足是指的这头牛即能吃到他喜欢吃的又能喝到他喜欢喝的 思路: ...
- Dining POJ - 3281 (网络流)
传送门 题意:农夫约翰为他的N头牛准备了F种食物和D种饮料.每头牛都有各自喜欢的食物和饮料,而每种食物或饮料只能分配给一头牛.最多能有多少头牛同时得到自己喜欢的食物和饮料? 题解:如果只是分配食物的话 ...
- POJ.3281 dining 最大流+拆点
POJ.3281 dining 最大流+拆点 思路清晰为啥一直WA呢 #include <iostream> #include <cstring> #include <v ...
- 解题报告:POJ 3281 Dining(最大流 / “三分图”建图)
B.POJ 3281 DiningDiningDining(最大流/建图模板)[省选/NOI- ] 有 F 种食物和 D 种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一 种食物和一种饮料.现 ...
- Poj 3281 Regional Chengdu Food(Dicnic)
网络流最大流的优化算法Dicnic,每一步对原图进行分层,然后用DFS求增广路.时间复杂度是O(n^2*m) . Poj 3281 和 9.16号成都regional网络赛food那道题,都是很好的模 ...
- poj 3281 Dining 最大流
题目链接 一开始的想法就是food-cow-water,但是wa了,看了别人的思路知道每一只牛牛用一条边隔开,然后就达到了限流的效果. 所以 食物-->牛牛---->牛牛---->w ...
- POJ 3281 -- Dining(最大流,拆点建图)
题目链接 Description Cows are such finicky eaters. Each cow has a preference for certain foods and drink ...
- POJ - 3281 Dining(最大流+思维建边)
题目链接:点击查看 题目大意:给出n头奶牛,f种食物,d种饮料,每只奶牛可以选择数种食物和饮料,但每种食物和饮料只有一份,现在问最多能让多少头奶牛同时满足食物和饮料的条件 题目分析:最大流的题目,不过 ...
- 【POJ - 3281】Dining(拆点建图,网络流最大流)
题干: Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she wi ...
最新文章
- 人类基因测序被重新定义,时间减半创世界纪录
- 打开Eclipse时出现Failed to create the Java Virtual Machine
- 【读书笔记《Android游戏编程之从零开始》】6.Android 游戏开发常用的系统控件(TabHost、ListView)...
- vue+elementUI 添加多个可以全选的多选框
- ROS学习笔记四:用C++编写ROS发布与订阅
- Spring MVC异常处理 - @ ControllerAdvice,@ ExceptionHandler,HandlerExceptionResolver
- 华云网际:虚拟机+廉价服务器 一体机就这么简单
- @程序员,解读 5G 中性命攸关的时延! | 技术头条
- aver函数C语言怎么用,C语言函数使用
- 成功恢复UNIX误删除数据库文件(NODE已被清除)
- python 批量提取 mkv 视频文件内嵌 srt 字幕
- python数学建模基础(一)——矩阵操作
- SIGBUS:BUS_ADRERR for stack access violation in memcpy
- 吸拖一体机和扫地机器人哪个好,吸拖一体机值得买吗
- 这108道 JavaOOP 面试题 你是不是都会了?
- Netty介绍与实战(三)之粘包拆包
- 【数学分析】伯努利不等式
- 一个简单的网路测试bat脚本
- 常用API,基本类型包装类,日期类,异常,集合进阶,IO流,多线程
- android布局优化!Android动态换肤实现原理解析,灵魂拷问