题意:

  农夫约翰为他的牛准备了F种食物和D种饮料。每头牛都有各自喜欢的食物和饮料,而每种食物或饮料只能分配给一头牛。最多能有多少头牛可以同时得到各自喜欢的食物和饮料?

思路:

  用 s -> 食物 -> 牛 -> 牛 -> 饮料 -> t 为路径,建图。然后跑最大流。

p.ps.: 抄的书上的思路和dfs增广路的模板,当做学习网络流的第一步吧 :)

代码:

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std; const int MAXV = ;
const int INF = 0x7fffffff; struct edge {
int to; //边的终点
int cap; //容量
int rev; //反向边的编号
}; vector<edge> G[MAXV]; //图的邻接表表示
bool used[MAXV]; //DFS中用到的访问标记 //向图中增加一条从s到t容量为cap的边
void addEdge(int from, int to, int cap) {
G[from].push_back((edge){to, cap, G[to].size()});
G[to].push_back((edge){from, , G[from].size()-});
} //dfs找增广路
int dfs(int v, int t, int f) {
if (v==t) return f; used[v] = true;
for (int i = ; i < G[v].size(); i++) {
edge &e = G[v][i];
if (!used[e.to] && e.cap>) {
int d = dfs(e.to, t, min(f, e.cap));
if (d>) { //如果找到一条可行路
e.cap -= d; //容量减少
G[e.to][e.rev].cap += d; //反向边容量增加
return d; //找到一条可行路就返回
}
}
}
return ;
} //求解从s到t的最大流
int maxFlow(int s, int t) {
int flow = ;
int f = -;
while (f!=) {
memset(used, false, sizeof(used));
f = dfs(s, t, INF);
flow += f;
}
return flow;
} const int MAXN = ; int N, F, D;
bool likeF[MAXN][MAXN];
bool likeD[MAXN][MAXN]; void input() {
memset(likeF, false, sizeof(likeF));
memset(likeD, false, sizeof(likeD));
scanf("%d%d%d", &N, &F, &D);
for (int i = ; i < N; i++) {
int f, d, t;
scanf("%d%d", &f, &d);
for (int j = ; j < f; j++) {
scanf("%d", &t);
likeF[i][t-] = true;
}
for (int j = ; j < d; j++) {
scanf("%d", &t);
likeD[i][t-] = true;
}
}
} void solve() {
//0~N-1: 食物一侧的牛
//N~2N-1: 饮料一侧的牛
//2N~2N+F-1: 食物
//2N+F~2N+F+D: 饮料
int s = N*+F+D, t = s+; //在s与食物之间连边
for (int i = ; i < F; i++) {
addEdge(s, N*+i, );
} //在饮料和t之间连边
for (int i = ; i < D; i++) {
addEdge(N*+F+i, t, );
} for (int i = ; i < N; i++) {
//在两头牛之间连边
addEdge(i, N+i, ); //食物到牛
for (int j = ; j < F; j++) if (likeF[i][j]) {
addEdge(N*+j, i, );
}
//牛到饮料
for (int j = ; j < D; j++) if (likeD[i][j]) {
addEdge(N+i, N*+F+j, );
}
}
printf("%d\n", maxFlow(s, t));
} int main() {
#ifdef Phantom01
freopen("PKU3281.txt", "r", stdin);
#endif // Phantom01 input();
solve(); return ;
}

PKU3281

PKU 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 (网络流) Description Cows are such finicky eaters. Each cow has a preference for certai ...

  8. 网络流——SAP模板

    //网络流SAP模板,复杂度O(N^2*M) //使用前调用init(源点,汇点,图中点的个数),然后调用add_edge()加边 //调用getflow得出最大流 #define N 55 #def ...

  9. POJ 3281 Dining(最大流)

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

随机推荐

  1. Python基本语法(基于3.x)

    Python的两种运行模式: 命令行模式,运行python,然后在命令行中输入python命令 程序脚本, 在命令行中输入 ./hello.py运行 Python是解释形语言,但可以通过工具打包成二进 ...

  2. Apache Ignite - 轉

    Ignite Docs Online: ignite-doc-cn https://dongwq.gitbooks.io/ignite-doc/content/index.html - Apache ...

  3. springMVC小项目实例

    一.什么是 Spring MVC Spring MVC 属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 里面,是一个强大灵活的 Web 框架.Spring ...

  4. 路飞学城Python-Day4(practise)

    #1.请用代码实现:利用下划线将列表的每一个元素拼接成字符串,li = ['alex','eric','rain']# li = ['alex','eric','rain']# print('_'.j ...

  5. [转载]PyCharm创建.py自动添加文件头注释

    转自:https://blog.csdn.net/qq_36482772/article/details/67218214 创建.py文件时 顺便自动添加作者.时间.文件名信息…… mac系统打开编辑 ...

  6. HDU 6051 If the starlight never fade(原根+推式子)

    题目大意: 设\(f(i)\)为使\((x+y)^i \equiv x^i (mod\ p)\)成立的(x,y)的对数.其中\(1 \leq x \leq p-1 , 1\leq y\leq m\), ...

  7. vue-quill-editor-upload : 实现vue-quill-editor上传图片到服务器

    vue-quill-editor-upload git: https://github.com/NextBoy/vu... A plug-in for uploading images to your ...

  8. linux查找某个命令属于哪个rpm包

    我们拿pip命令来举例 方法一: 确认命令的路径 # which pip      /usr/bin/pip 用yum命令查找pip属于哪个rpm包 # yum whatprovides /usr/b ...

  9. ORACLE数据库字符集处理

    简介: ORACLE数据库字符集,即Oracle全球化支持(Globalization Support),或即国家语言支持(NLS)其作用是用本国语言和格式来存储.处理和检索数据.利用全球化支持,OR ...

  10. [MST] Create an Entry Form to Add Models to the State Tree

    It is time to add new entries to the wishlist. We will achieve this by reusing forms and models we'v ...