题目链接:

  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. 【网络】TCP的拥塞控制

    一.拥塞控制的一般原理 拥塞:对网络中某一资源的需求超过了该资源所能提供的可用部分 拥塞控制是防止过多的数据注入到网络,这样可以使网络中的路由器或链路不致过载,拥塞控制是一个全局性的过程. 流量控制往 ...

  2. NoSQL之Memcached

    一.Memcached概念 Memcached是NoSQL产品之中的一个,是一个暂时性键值存储NoSQL数据库,过去被大量使用在互联网站点中,作为应用和数据库之间的缓存层,大大提高查询和訪问速度. M ...

  3. iOS设计模式 - (1)概述

    近期可自由安排的时间比較多, iOS应用方面, 没什么好点子, 就先放下, 不写了.花点时间学学设计模式. 之后将会写一系列博文, 记录设计模式学习过程. 当然, 由于我自己是搞iOS的, 所以之后设 ...

  4. Cocos2d-x 3.1.1 学习日志12--一Cocos2dx3.1.1移植到Android平台的方法(最实用最有效的!!)

    须要用到工具(依照顺序): 1.JDK 2.NDK 3.ANT 4.Adt-bundle-windows 将JDK文件夹下的bin文件夹路径加入到系统环境变量中. 解压NDK 解压Adt-bundle ...

  5. &lt;Android&gt;greenrobot-EventBus,guava-Event Bus的异步实现

    刚開始是从otto入手,可是otto不支持异步运行.所以后来才開始研究了Event Bus.关于Event Bus,先前搜索的时候,看到网上的实例,非常碎,并且非常多都是一样的内容,代码看下来基本上是 ...

  6. Swift String 一些经常用法

    直接上代码 //字符串 //1 推断字符串是否为空 var test1Str="" var test1Str2:String = String(); println("t ...

  7. 2016/3/31 ①全选时 下面选项全选中 ② 下面不选中时 全选取消 ③在“” 中 转义字符的使用\ onclick=\"Checkpa(this,'flall')\"; ④区别于分别实现 重点在于两种情况合并实现

    testxuanbuxuan.php <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  8. 2016/2/25 onchange 应用

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Lightoj 1011 - Marriage Ceremonies

    You work in a company which organizes marriages. Marriages are not that easy to be made, so, the job ...

  10. YTU 1006: Hero In Maze

    1006: Hero In Maze 时间限制: 1000 Sec  内存限制: 64 MB 提交: 72  解决: 22 题目描述 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人 ...