题目链接:

  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. httpclient请求去掉返回结果string中的多余转义字符

    public String doGet() { String uriAPI = "http://XXXXX?str=I+am+get+String"; String result= ...

  2. 【Git使用具体解释】Egit的经常使用操作具体解释

    经常使用操作 操作 说明 Fetch 从远程获取最新版本号到本地,不会自己主动merge Merge 能够把一个分支标签或某个commit的改动合并如今的分支上 Pull 从远程获取最新版本号并mer ...

  3. 16款创建CSS3动画的jQuery插件

    jQuery插件是用来扩展jQuery原型对象的方法. 本文搜集了用来为你的站点创建CSS3动画的一些jQuery插件. 1. jQuery Smoove Smoove 简化了CSS3转换效果.使得页 ...

  4. hi3531 SDK已编译文件系统制作jffs2文件系统镜像并解决这个问题 .

    一, 安装SDK 1.Hi3531 SDK包位置 在"Hi3531_V100R001***/01.software/board"文件夹下,您能够看到一个 Hi3531_SDK_Vx ...

  5. linux系统编程:线程同步-相互排斥量(mutex)

    线程同步-相互排斥量(mutex) 线程同步 多个线程同一时候訪问共享数据时可能会冲突,于是须要实现线程同步. 一个线程冲突的演示样例 #include <stdio.h> #includ ...

  6. 2016/04/26 权限 数据库mydb2 五个表 分别是 1,用户 2,角色 3,权限 4,用户对应的角色 5,角色对应的权限

    权限:   1,后台分配角色     角色对应权限    2,各用户通过登录页面登录    查看到各自的权限 五个页面   加引入一个jquery-1.11.2.min.js 1,guanli.php ...

  7. my.cnf配置详解[转载]

    先粘贴一份mac下的mysql5.6.22的配置文件 # Example MySQL config file for medium systems. # # This is for a system ...

  8. springMVC中的中心控制Servlet是那个类?(B)

    A:ActionServlet B:DispatcherServlet C:AbstractController D:FacesServlet

  9. mongo14-----group,aggregate,mapReduce

    group,aggregate,mapReduce 分组统计: group() 简单聚合: aggregate() 强大统计: mapReduce() db.collection.group(docu ...

  10. java集合的关系

    在 Java2中,有一套设计优良的接口和类组成了Java集合框架Collection,使程序员操作成批的数据或对象元素极为方便.这些接口和类有很多对抽象数据类型操作的API,而这是我们常用的且在数据结 ...