POJ 3281 Dining (网络流)

Description

Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will consume no others.

Farmer John has cooked fabulous meals for his cows, but he forgot to check his menu against their preferences. Although he might not be able to stuff everybody, he wants to give a complete meal of both food and drink to as many cows as possible.

Farmer John has cooked F (1 ≤ F ≤ 100) types of foods and prepared D (1 ≤ D ≤ 100) types of drinks. Each of his N (1 ≤ N ≤ 100) cows has decided whether she is willing to eat a particular food or drink a particular drink. Farmer John must assign a food type and a drink type to each cow to maximize the number of cows who get both.

Each dish or drink can only be consumed by one cow (i.e., once food type 2 is assigned to a cow, no other cow can be assigned food type 2).

Input

Line 1: Three space-separated integers: N, F, and D

Lines 2.. N+1: Each line i starts with a two integers Fi and Di, the number of dishes that cow i likes and the number of drinks that cow i likes. The next Fi integers denote the dishes that cow i will eat, and the Di integers following that denote the drinks that cow i will drink.

Output

Line 1: A single integer that is the maximum number of cows that can be fed both food and drink that conform to their wishes

Sample Input

4 3 3

2 2 1 2 3 1

2 2 2 3 1 2

2 2 1 3 1 2

2 1 1 3 3

Sample Output

3

Http

POJ:https://vjudge.net/problem/POJ-3281

Source

网络流

题目大意

有n只牛,F种食物,D种饮料,每一只牛喜欢若干食物和饮料。现在要给每一只牛分配食物和饮料,每一种食物或饮料只够一只牛吃。若一只牛吃到了它喜欢的食物和饮料(注意是两个都要符合),它就会很开心。现在求最多能使多少只牛开心

解决思路

这道题与Luogu1402有些类似,但不知道为什么我用二分图的方法会WrongAnswer。所以我们用网络流最大流来解决。

对于每一只牛i我们把其拆成两个点i和i+n,在i与i+n中连一条流量为1的边。这样是为了保证一只牛只吃到一种食物和一种饮料。再在对应的食物与牛i连容量为1的边,在对应的牛与饮料连容量为1的边。最后再连上超级源点和超级汇点就可以了。

虽然笔者是使用EK算法实现的网络流最大流,但是更推荐效率更优的Dinic算法,具体请移步我的这篇文章

代码

EK算法

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; const int maxN=510;
const int maxM=2147483647;
const int inf=2147483647; int n,F,D;
int G[maxN][maxN];
int Flow[maxN];
int Path[maxN]; bool bfs(); int main()
{
memset(G,0,sizeof(G));
scanf("%d%d%d",&n,&F,&D);
for (int i=1;i<=n;i++)//先在拆出来的牛点之间连边
G[i][i+n]=1;
for (int i=1;i<=n;i++)
{
int n1,n2;
scanf("%d%d",&n1,&n2);
for (int j=1;j<=n1;j++)
{
int v;
scanf("%d",&v);
G[2*n+v][i]=1;//连牛与食物
}
for (int j=1;j<=n2;j++)
{
int v;
scanf("%d",&v);
G[i+n][2*n+F+v]=1;//连牛与饮料
}
}
for (int i=1;i<=F;i++)
G[0][n*2+i]=1;//连源点
for (int i=1;i<=D;i++)
G[n*2+F+i][n*2+F+D+1]=1;//连汇点
int Ans=0;
while (bfs())//EK算法
{
int di=Flow[n*2+F+D+1];
int now=n*2+F+D+1;
int last=Path[now];
while (now!=0)
{
G[last][now]-=di;
G[now][last]+=di;
now=last;
last=Path[now];
}
Ans++;
}
cout<<Ans<<endl;
return 0;
} bool bfs()
{
memset(Path,-1,sizeof(Path));
memset(Flow,0,sizeof(Flow));
Flow[0]=inf;
queue<int> Q;
while (!Q.empty())
Q.pop();
Q.push(0);
do
{
int u=Q.front();
Q.pop();
for (int i=0;i<=2*n+F+D+1;i++)
{
if ((Path[i]==-1)&&(G[u][i]>0))
{
Path[i]=u;
Q.push(i);
Flow[i]=min(Flow[u],G[u][i]);
}
}
}
while (!Q.empty());
if (Flow[n*2+F+D+1]==0)
return 0;
return 1;
}

POJ 3281 Dining (网络流)的更多相关文章

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

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

  2. POJ 3281 Dining 网络流最大流

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

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

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

  4. POJ 3281 Dining[网络流]

    Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will c ...

  5. POJ 3281 Dining (网络流构图)

    [题意]有F种食物和D种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料.现在有N头牛,每头牛都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几头牛同时享用到自己喜欢的食物和 ...

  6. POJ 3281 Dining(网络流-拆点)

    Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will c ...

  7. POJ 3281 Dining(最大流)

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

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

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

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

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

随机推荐

  1. ptrace注入型病毒“聊天剽窃手”分析

    概述 “聊天剽窃手”Windseeker是一款间谍软件,它使用了ptrace进程注入技术,能够对微信和QQ的聊天记录进行监控. 软件安装后的桌面图标和启动界面如图所示:   行为分析 该应用首先获取手 ...

  2. XSS Challenges练习及解答

    一个偶然的机会在知道创宇的技能表里看到了一个练习XSS的网站http://xss-quiz.int21h.jp,正好想研究这个,于是试着做了一下. 第一.二题是最简单的,直接在搜索框中输入以下代码就成 ...

  3. 编程语法分析之“优先级”和“结合律”

    上节<编程语法分析之从表达式说起>中说到表达式,他的主要作用就是返回一个值!那这个值具体是多少,就要看表达式的整个运算过程.要理解表达式的运算过程就必须了解"优先级"和 ...

  4. [arm学习]makefile学习总结

    makefile不仅仅是一个命令的集合体,其中有一些规则是需要理解掌握的. 首先,了解makefile的规则: //-----------格式---------- 目标 : 依赖1,依赖2 (TAP键 ...

  5. 【第三课】Centos 7.x系统安装和网络配置以及远程密钥登录

    目录 一.安装CentOS 7.3 二.配置网络 1.使用dhclient命令自动获取ip地址 2.使用ip addr或ifconfig命令查看网卡信息 3.使用route命令查看路由信息 4.通过修 ...

  6. JavaScript闭包简单应用

    闭包定义 在JavaScript中,当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包.简单说,闭包就是能够读取其他函数内部变量的函数. 闭包的作用: 1. 可以读取函数内部的变量 2. 让 ...

  7. JavaScript快速入门-ECMAScript语句

    JavaScript语句(if.for.for in.do...while.while.break.continue.switch) 一.if语句 if (condition) statement1 ...

  8. stl源码剖析 详细学习笔记 空间配置器

    //---------------------------15/04/05---------------------------- /* 空间配置器概述: 1:new操作包含两个阶段操作 1>调 ...

  9. c++ Arx二次开发创建椭圆和样条曲线

    一.本节课程 c++ Arx二次开发创建椭圆和样条曲线 二.本节要讲解的知识点 1.如何应用C++ ARX二次开发创建椭圆(对AcDbEllipse类的构造函数的直接封装和根据外接矩形来创建椭圆) 2 ...

  10. 关于k8s这项大动作,预示着边缘计算迎来“开源”发展的新周期……

    在文章<最近在边缘计算领域,发生了一件足以载入物联网史册的大事…>我曾经提到Kubernetes(简称K8s)将从超大规模云计算环境,被带入到物联网边缘计算场景中. 事情有了新进展,从本周 ...