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. 20155218《网络对抗》Exp3 免杀原理与实践

    20155218<网络对抗>Exp3 免杀原理与实践 一.使用msf生成后门程序的检测 (1)将上周msf生成的后门文件放在virscan.org中进行扫描,截图如下: (2)使用msf时 ...

  2. 20155302 Exp2 后门原理与实践

    20155302<网络对抗>后门原理与实践 实验要求 1.使用netcat获取主机操作Shell,cron启动 (0.5分) 2.使用socat获取主机操作Shell, 任务计划启动 (0 ...

  3. 《Flask Web开发实战:入门、进阶与原理解析(李辉著 )》PDF+源代码

    一句话评价: 这可能是市面上(包括国外出版的)你能找到最好的讲Flask的书了 下载:链接: https://pan.baidu.com/s/1ioEfLc7Hc15jFpC-DmEYBA 提取码: ...

  4. Luogu P2055 [ZJOI2009]假期的宿舍

    一道网络有关的问题,还是一句话 网络流重在建模! 这里主要讲两种算法. 1.二分图匹配: 分析题意,我们可以知道题目要求是让所有留在学校的人都能有床睡 而 所有留在学校的人=本校不回家的人+外校的人: ...

  5. windows系统中Dotnet core runtime 安装后,无法启动次程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll的解决方法

    因为dotnet core runtime依赖vc++2015,如果系统未安装vc++2015则会报上面的错误 解决方案:先下载安装vc++2015再安装dotnet core runtime, vc ...

  6. Java 多线程(二)之 Thread 优先级

    目录 Thread 中线程优先级相关属性 相关函数 优先级初始化 设置优先级 获取优先级 默认优先级 指定优先级 注意事项 优先级继承 @ Thread 中线程优先级相关属性 每个线程均有优先级,在 ...

  7. Zabbix使用总结

    1. CentOS 7上启动zabbix-server失败,/var/log/messages中的报错信息如下: Feb :: mysql-server1 systemd: Starting Zabb ...

  8. 【ORACLE】oracle打补丁

    -- 备份旧的opatch cd $ORACLE_HOME/ mv OPatch  OPatch_20180323_old -- 上传补丁工具和补丁包到oraclehome目录下,解压 unzip p ...

  9. effective c++ 笔记 (26-29)

    //---------------------------15/04/09---------------------------- //#26   尽可能延后变量定义式的出现时间 { /*  1:只要 ...

  10. Win10环境配置Bitcoin Core节点

    区块链是当下比较火热的技术,我也来蹭下热度,研究一把Bitcoin Core的技术. 入门篇 一.Bitcoin Core安装 1.下载 一般有2种安装方式:源码编译安装 和 下载现成的安装包安装 源 ...