题目链接:

  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 (最大网络流)的更多相关文章

  1. POJ 3281 Dining (网络流)

    POJ 3281 Dining (网络流) Description Cows are such finicky eaters. Each cow has a preference for certai ...

  2. POJ 3281 Dining(网络流拆点)

    [题目链接] http://poj.org/problem?id=3281 [题目大意] 给出一些食物,一些饮料,每头牛只喜欢一些种类的食物和饮料, 但是每头牛最多只能得到一种饮料和食物,问可以最多满 ...

  3. poj 3281 Dining(网络流+拆点)

    Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 20052   Accepted: 8915 Descripti ...

  4. POJ 3281 Dining(网络流最大匹配)

    分析: 数学模型是三个集合A,B,C,(a,b,c)构成一个匹配.因为图一个点只能匹配一次,把a拆点a',a", 在可以匹配的点上连边,s - b - a' - a" - c - ...

  5. POJ 3281 Dining(最大流)

    POJ 3281 Dining id=3281" target="_blank" style="">题目链接 题意:n个牛.每一个牛有一些喜欢的 ...

  6. poj 3281 Dining 网络流-最大流-建图的题

    题意很简单:JOHN是一个农场主养了一些奶牛,神奇的是这些个奶牛有不同的品味,只喜欢吃某些食物,喝某些饮料,傻傻的John做了很多食物和饮料,但她不知道可以最多喂饱多少牛,(喂饱当然是有吃有喝才会饱) ...

  7. POJ 3281 Dining 网络流最大流

    B - DiningTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.ac ...

  8. poj 3281 Dining【拆点网络流】

    Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11828   Accepted: 5437 Descripti ...

  9. POJ 3281 Dining (网络流之最大流)

    题意:农夫为他的 N (1 ≤ N ≤ 100) 牛准备了 F (1 ≤ F ≤ 100)种食物和 D (1 ≤ D ≤ 100) 种饮料.每头牛都有各自喜欢的食物和饮料, 而每种食物或饮料只能分配给 ...

随机推荐

  1. C语言取整方法总结

    C语言有下面几种取整方法: 1.   直接赋值给整数变量     int i = 3.5; 或 i = (int) 3.5; 这样的方法採用的是舍去小数部分. 2.整数除法运算符' / '取整 ' / ...

  2. topcoder srm 551

    div1 250pt 题意:一个长度最多50的字符串,每次操作可以交换相邻的两个字符,问,经过最多MaxSwaps次交换之后,最多能让多少个相同的字符连起来 解法:对于每种字符,枚举一个“集结点”,让 ...

  3. 字符设备之poll机制

    poll机制作用:相当于一个定时器.时间到了还没有资源就唤醒进程. 主要用途就是:进程设置一段时间用来等待资源,假设时间到了资源还没有到来,进程就立马从睡眠状态唤醒不再等待.当然这仅仅是使用于这段时间 ...

  4. 类的相互依赖导致StackOverflowError

    public class SchoolServiceImpl { private static SchoolServiceImpl instance = new SchoolServiceImpl() ...

  5. Hive中行列转换

    1.演示多列转为单行 数据文件及内容: student.txt xiaoming|english|92.0 xiaoming|chinese|98.0 xiaoming|math|89.5 huahu ...

  6. 【bzoj1071】[SCOI2007]组队

    sum= A*h+B*s排序 然后枚举height和speed的最小值 然后用两个指针:先枚举speed最小值,然后一边枚举v的最小值一边查询符合条件的人数. #include<algorith ...

  7. Linux的进程优先级NI和PR到底有什么区别

    Linux的进程优先级NI和PR到底有什么区别 - 51CTO.COM http://os.51cto.com/art/201605/511559.htm

  8. [10.27_P2] 统计损失 (简单树形DP)

    树形DP 简单题 Description 给定一棵树,每个节点有一个值.对于一条路径,它的值为路径上所有点的值的乘积.求出树上所有路径的值的和. 注意:单个点也算一条路径. Input 第 1 行一个 ...

  9. caioj1270: 概率期望值1:小象涂色

    DP深似海,得其得天下.——题记 叕叕叕叕叕叕叕叕叕叕叕(第∞次学DP内容)被D飞了,真的被DP(pa)了.这次D我的是大叫着第二题比较难(小象涂色傻b题)的Mocha(zzz)大佬,表示搞个概率DP ...

  10. USACO26 moofest 奶牛集会(归并排序)

    听说这题也是bzoj的3378&&poj1990,然而没有权限号交不了..poj懒得登. 题意:有n个奶牛,他们相互发出max(a[i].v,a[j].v)*abs(a[i].p-a[ ...