poj 3281 Dining (最大网络流)
题目链接:
http://poj.org/problem?id=3281
题目大意:
有n头牛,f种食物,d种饮料,第i头牛喜欢fi种食物和di种饮料,每种食物或者饮料被一头牛选中后,就不能被其他的牛选了,问最多能满足多少头牛的要求?
解题思路:
最大匹配问题,关键在于如何建图,可以虚构出来一个源点,一个汇点,一共需要f+d+2*n+2个点即可,建图为:源点—>食物—>牛—>牛—>饮料—> 汇点。把牛作为点拆开建图是为了让一头牛只对应一种饮料和一种食物,避免出现对应多种饮料或者多种食物的情况。
代码:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <queue>
using namespace std; #define maxn 0x3f3f3f3f
#define N 410
int map[N][N], Layer[N], s, e;
bool visit[N];
bool CountLayer();
int Dinic (); int main ()
{
int n, f, d, x, y, m;
while (scanf ("%d %d %d", &n, &f, &d) != EOF)
{
s = , e = f + d + n + n + ;
memset (map, , sizeof(map)); for (int i=; i<=f; i++)
map[][i] = ;//食物和源点连线 for (int i=; i<=d; i++)
map[i+f+*n][e] = ;//饮料和汇点链接 for (int i=; i<=n; i++)
map[i+f][i+f+n] = ;//对应的牛和牛链接 for (int i=; i<=n; i++)
{//建立牛和食物及饮料的关系
int num = f + i;
scanf ("%d %d", &x, &y);
while (x --)
{
scanf ("%d", &m);
map[m][num] = ;
}
while (y --)
{
scanf ("%d", &m);
map[num + n][m+f+*n] = ;
}
}
printf ("%d\n", Dinic());
}
return ;
} bool CountLayer()
{
deque <int> Q;
memset (Layer, , sizeof(Layer));
Layer[] = ;
Q.push_back();
while (!Q.empty())
{
int nd = Q.front();
Q.pop_front();
for (int i=s; i<=e; i++)
{
if (map[nd][i]> && !Layer[i])
{
Layer[i] = Layer[nd] + ;
if (i == e)
return true;
else
Q.push_back(i);
}
}
}
return false;
} int Dinic ()//Dinic模板
{
int maxnflow = , i;
while (CountLayer())
{
deque<int>Q;
memset (visit, , sizeof(visit));
visit[] = ;
Q.push_back();
while (!Q.empty())
{
int nd = Q.back();
if (nd != e)
{
for (i=; i<=e; i++)
{
if (map[nd][i]> && Layer[i] == Layer[nd]+ && !visit[i])
{
visit[i] = ;
Q.push_back(i);
break;
}
}
if (i > e)
Q.pop_back();
}
else
{
int minflow = maxn;
int mv;
for (i=; i<Q.size(); i++)
{
int ns = Q[i-];
int ne = Q[i];
if (map[ns][ne] < minflow)
{
minflow = map[ns][ne];
mv = ns;
}
}
maxnflow += minflow;
for (i=; i<Q.size(); i++)
{
int ns = Q[i-];
int ne = Q[i];
map[ns][ne] -= minflow;
map[ne][ns] += minflow;
}
while (!Q.empty() && Q.back() != mv)
Q.pop_back();
}
}
}
return maxnflow;
}
poj 3281 Dining (最大网络流)的更多相关文章
- POJ 3281 Dining (网络流)
POJ 3281 Dining (网络流) Description Cows are such finicky eaters. Each cow has a preference for certai ...
- POJ 3281 Dining(网络流拆点)
[题目链接] http://poj.org/problem?id=3281 [题目大意] 给出一些食物,一些饮料,每头牛只喜欢一些种类的食物和饮料, 但是每头牛最多只能得到一种饮料和食物,问可以最多满 ...
- poj 3281 Dining(网络流+拆点)
Dining Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 20052 Accepted: 8915 Descripti ...
- POJ 3281 Dining(网络流最大匹配)
分析: 数学模型是三个集合A,B,C,(a,b,c)构成一个匹配.因为图一个点只能匹配一次,把a拆点a',a", 在可以匹配的点上连边,s - b - a' - a" - c - ...
- POJ 3281 Dining(最大流)
POJ 3281 Dining id=3281" target="_blank" style="">题目链接 题意:n个牛.每一个牛有一些喜欢的 ...
- poj 3281 Dining 网络流-最大流-建图的题
题意很简单:JOHN是一个农场主养了一些奶牛,神奇的是这些个奶牛有不同的品味,只喜欢吃某些食物,喝某些饮料,傻傻的John做了很多食物和饮料,但她不知道可以最多喂饱多少牛,(喂饱当然是有吃有喝才会饱) ...
- POJ 3281 Dining 网络流最大流
B - DiningTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.ac ...
- poj 3281 Dining【拆点网络流】
Dining Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11828 Accepted: 5437 Descripti ...
- POJ 3281 Dining (网络流之最大流)
题意:农夫为他的 N (1 ≤ N ≤ 100) 牛准备了 F (1 ≤ F ≤ 100)种食物和 D (1 ≤ D ≤ 100) 种饮料.每头牛都有各自喜欢的食物和饮料, 而每种食物或饮料只能分配给 ...
随机推荐
- Java8初体验(二)Stream语法详解(转)
本文转自http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com上篇文章Java8初体验(一 ...
- [转]JAVA异常
异常 异常就是导致程序中断执行的一段指令流. 在java中, 对于异常在API中也有明确的定义,叫做异常类. Error : JVM的错误, 程序中不进行处理, 交给虚拟机. Exception : ...
- HDU 5303 Delicious Apples (贪心 枚举 好题)
Delicious Apples Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Other ...
- kindle】扫描版PDF完美切割六寸
kindle]扫描版PDF完美切割六寸 半夏 2013-11-05 18:36:01 软件来源记不清了..连使用说明的网址都找不到了,自己写一下使用方法大家凑合一下呗~ 软件是大牛写的 ...
- How to: Use Submix Voices
How to: Use Submix Voices:https://msdn.microsoft.com/en-us/library/windows/desktop/ee415794(v=vs.85) ...
- scrapy框架的解析
1,scrapy框架的官网:https://scrapy.org/ 什么是scrapy框架: scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用内框架,非常出名,所谓框架就是一个已经继承 ...
- Ant 打包 问题
Ant 打包问题及解决归纳总结: 1.build.xml注意设置basedir: <project name="s2si" default="dist" ...
- Cg入门23: Fragment shader – UV动画(序列帧)
让动画从1-9循环播放此纹理 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkF ...
- XMU 1606 nc与滴水问题 【模拟】
1606: nc与滴水问题 Time Limit: 1000 MS Memory Limit: 64 MBSubmit: 85 Solved: 27[Submit][Status][Web Boa ...
- openfire源码编译后部署到linux
1.源码通过编号后,会生成target目录,直接把target目录拷贝到linux下即可: 2.启动openfire: ./openfire.sh start 3.退出直接ctr + c 问题:如果一 ...