POJ3281 Dining(拆点构图 + 最大流)
题意:有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 = ;
const int INF = 0x3f3f3f3f;
int g[Max][Max];
int N, F, D;
int pre[Max];
int BFS()
{
memset(pre, -, sizeof(pre));
int MinFlow = INF;
queue<int> que;
pre[] = ;
que.push();
int des = F + * N + D + ;
while (!que.empty())
{
int x = que.front();
que.pop();
if (x == des)
break;
for (int i = ; i <= des; i++)
{
if (pre[i] == - && g[x][i])
{
if (MinFlow > g[x][i])
{
MinFlow = g[x][i];
}
pre[i] = x;
que.push(i);
}
}
}
if (pre[des] == -)
return -;
return MinFlow;
}
void EK()
{
int MaxFlow = , inFlow = , des;
while ( (inFlow = BFS()) != -)
{
MaxFlow += inFlow;
des = F + * N + D + ;
while (des != )
{
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, , sizeof(g));
int fd, fnum, dnum;
for (int i = ; i <= N; i++)
{
scanf("%d%d", &fnum, &dnum);
for (int j = ; j < fnum; j++)
{
scanf("%d", &fd);
g[][fd] = ; // 0点作为起点连接每个食物
g[fd][F + i] = ; // 食物和牛相连,食物最大F,
}
g[F + i][F + N + i] = ; // 牛 和 牛相连
for (int j = ; j <= dnum; j++)
{
scanf("%d", &fd);
g[F + N + i][F + N + N + fd] = ; // 牛和饮料相连
g[F + N + N + fd][F + N + N + D + ] = ; // 设一个终点让每一个 饮料 和他相连,流量为1
}
}
EK();
}
}
int main()
{
buildGraph();
return ;
}
POJ3281 Dining(拆点构图 + 最大流)的更多相关文章
- <每日一题>Day 9:POJ-3281.Dining(拆点 + 多源多汇+ 网络流 )
Dining Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 24945 Accepted: 10985 Descript ...
- POJ 3281 Dining (拆点)【最大流】
<题目链接> 题目大意: 有N头牛,F种食物,D种饮料,每一头牛都有自己喜欢的食物和饮料,且每一种食物和饮料都只有一份,让你分配这些食物和饮料,问最多能使多少头牛同时获得自己喜欢的食物和饮 ...
- POJ3281 Dining —— 最大流 + 拆点
题目链接:https://vjudge.net/problem/POJ-3281 Dining Time Limit: 2000MS Memory Limit: 65536K Total Subm ...
- ACM/ICPC 之 网络流-拆点构图(POJ2391)
需要直接到达,因此源点经过三条边后必须要达到汇点,但为了保证网络流的正确性(路径可反悔),因此不可限制层次网络的最高层次为3,最好的方法既是让所有点拆分成两个点,一个点从汇点进入,一个点通向汇点,任意 ...
- [poj3281]Dining(最大流+拆点)
题目大意:有$n$头牛,$f$种食物和$d$种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料.每头牛都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几头牛同时享用到自己喜欢 ...
- poj3281 Dining 最大流(奇妙的构图)
我是按照图论500题的文档来刷题的,看了这题怎么也不觉得这是最大流的题目.这应该是题目做得太少的缘故. 什么是最大流问题?最大流有什么特点? 最大流的特点我觉得有一下几点: 1.只有一个起点.一个终点 ...
- 2018.06.27 POJ3281 Dining(最大流)
Dining Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21578 Accepted: 9545 Description C ...
- POJ3281 Dining 最大流
题意:有f种菜,d种饮品,每个牛有喜欢的一些菜和饮品,每种菜只能被选一次,饮品一样,问最多能使多少头牛享受自己喜欢的饮品和菜 分析:建边的时候,把牛拆成两个点,出和入 1,源点向每种菜流量为1 2,每 ...
- TZOJ 1705 Dining(拆点最大流)
描述 Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she wil ...
随机推荐
- struct socket 结构详解
Socket数据结构网络协议CC++ 用户使用socket系统调用编写应用程序时,通过一个数字来表示一个socket,所有的操作都在该数字上进行,这个数字称为套接字描述符.在系统调用 的实现函 ...
- 手机信号强度单位dB、dBm和asu
dB.dBm都是功率增益的单位,不同之处如下: dB是一个表征相对值的值,纯粹的比值,只表示两个量的相对大小关系,没有单位,当考虑甲的功率相比于乙功率大或小多少个dB时,按下面的计算公式:10log( ...
- 使用Topshelf创建Windows服务
概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的 ...
- WEB 文件上传
关键:<input name="file" type="file"/> 然后,在外面<form>层中必须写上:enctype=" ...
- Day One(Beta)
站立式会议 站立式会议内容总结 331 今天:自己摸索了BaseAdapter删除元素的三种方式更新效率逐步上升 明天:学习webkit的webview的使用 442 今天:书籍评价界面,计划删除功能 ...
- 使用while循环输入 1 2 3 4 5 6 8 9 10
n = 1 while n<11: if n==7: pass else: print(n) n = n +1
- Dubbo系列(3)_官方Demo说明
一.本文目的 通过Dubbo的官方Demo介绍,学会搭建一个简单的Dubbo程序,包括服务端.客户端.接口等. Demo地址:https://github.com/alibaba/dubbo/ ...
- 【CodeVS 1199】【NOIP 2012】开车旅行
http://codevs.cn/problem/1199/ 主要思想是倍增,对于第一个回答从后往前扫,依次插入平衡树中. 我写的splay,比较繁琐. #include<cmath> # ...
- 【BZOJ 4515】【SDOI 2016 Round1 Day1 T3】游戏
考场上写了lct,可惜当时对标记永久化的理解并不是十分深刻,导致调一个错误的程序调了4h+,最后这道题爆0了QwQ 现在写了树链剖分,用标记永久化的线段树维护轻重链,对于$s\rightarrow l ...
- editplus-查找替换的正则表达式应用
editplus查找替换的正则表达式应用 表达式 说明 \t 制表符. \n 新行. . 匹配任意字符. | 匹配表达式左边和右边的字符. 例如, "ab|bc" 匹配 " ...