PKU 3281 Dining 网络流 (抄模板)
题意:
农夫约翰为他的牛准备了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 网络流 (抄模板)的更多相关文章
- poj 3281 Dining 网络流-最大流-建图的题
题意很简单:JOHN是一个农场主养了一些奶牛,神奇的是这些个奶牛有不同的品味,只喜欢吃某些食物,喝某些饮料,傻傻的John做了很多食物和饮料,但她不知道可以最多喂饱多少牛,(喂饱当然是有吃有喝才会饱) ...
- POJ 3281 Dining 网络流最大流
B - DiningTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.ac ...
- POJ 3281 Dining (网络流之最大流)
题意:农夫为他的 N (1 ≤ N ≤ 100) 牛准备了 F (1 ≤ F ≤ 100)种食物和 D (1 ≤ D ≤ 100) 种饮料.每头牛都有各自喜欢的食物和饮料, 而每种食物或饮料只能分配给 ...
- POJ 3281 Dining[网络流]
Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will c ...
- POJ 3281 Dining (网络流构图)
[题意]有F种食物和D种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料.现在有N头牛,每头牛都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几头牛同时享用到自己喜欢的食物和 ...
- POJ 3281 Dining(网络流-拆点)
Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will c ...
- POJ 3281 Dining (网络流)
POJ 3281 Dining (网络流) Description Cows are such finicky eaters. Each cow has a preference for certai ...
- 网络流——SAP模板
//网络流SAP模板,复杂度O(N^2*M) //使用前调用init(源点,汇点,图中点的个数),然后调用add_edge()加边 //调用getflow得出最大流 #define N 55 #def ...
- POJ 3281 Dining(最大流)
POJ 3281 Dining id=3281" target="_blank" style="">题目链接 题意:n个牛.每一个牛有一些喜欢的 ...
随机推荐
- STM8S汇编代码分析
转载:http://blog.csdn.net/u010093140/article/details/50021897使用STVD建立完汇编工程项目之后(具本建立方法可以看我的另一篇博文http:// ...
- Set集合[HashSet,TreeSet,LinkedHashSet],Map集合[HashMap,HashTable,TreeMap]
------------ Set ------------------- 有序: 根据添加元素顺序判定, 如果输出的结果和添加元素顺序是一样 无序: 根据添加元素顺序判定,如果输出的结果和添加元素的顺 ...
- JVM内存管理简单剖析
Java是一个跨平台语言,屏蔽操作系统的差异,无需关心复杂内存管理,做到编写一次到处运行.其强大的能力源于Java Virtual Machine (虚拟机)默默的付出.代码运行在虚拟机之上,虚拟机运 ...
- 安装 glusterfs yum源报错
yum install glusterfs-server yum 一直报错 把/etc/yum.repos.d 备份 删除了所有文件,从测试机192..168.59.128上同步过来 一直报错 已加载 ...
- Redis加入Centos Linux开机启动
Redis加入Centos Linux开机启动 网上有很多redis在linux下自动启动的例子,实现的方式很多,很多都是参考一个老外流传出来启动的例子,其实直接使用是不行,而且有很多地方有一些语法错 ...
- 赵雅智:android教学大纲
带下划线为详细内容链接地址.点击后可跳转.希望给大家尽一些微薄之力.眼下还在整理中 教学章节 教学内容 学时安排 备注 1 Android高速入门 2 Android模拟器与常见命令 3 Androi ...
- 38.angular的scope作用域
转自:https://www.cnblogs.com/best/tag/Angular/ 1. Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带. S ...
- django 笔记13 CSRF
CSRF a. CSRF原理 b. 无CSRF时存在隐患 c. Form提交(CSRF) d. Ajax提交(CSRF) CSRF请求头 x-CSRFToken HTTP_X_CSRFToken dj ...
- BZOJ 3931 Dijkstra+网络流
思路: (我能说按照题意模拟么) 用long long inf 要开大--. //By SiriusRen #include <queue> #include <cstdio> ...
- MetaSploit攻击实例讲解------Metasploit自动化攻击(包括kali linux 2016.2(rolling) 和 BT5)
不多说,直接上干货! 前期博客 Kali linux 2016.2(Rolling)里Metasploit连接(包括默认和自定义)的PostgreSQL数据库 Kali linux 2016.2(Ro ...