http://poj.org/problem?id=3281

题意:有n头牛,f种食物,d种饮料,每头牛有fnum种喜欢的食物,dnum种喜欢的饮料,每种食物如果给一头牛吃了,那么另一个牛就不能吃这种食物了,饮料也同理,问最多有多少头牛可以吃到它喜欢的饮料和食物。

思路:一开始还以为二分匹配可以做,当然如果只有食物或者饮料其中一种就可以做。难点在于建图。看了下书,因为要保证经过牛的流量是1(每种食物对应分配给一头牛,每种饮料对应分配给一头牛,避免一头牛吃多份),所以要把牛拆成两个点。形成这样的路径S->f->cow1->cow2->d->T。

算法思想大概是通过BFS构造出分层图,然后通过DFS找增广路更新边流量和最大流的信息。

转的图。

 #include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define N 410
#define INF 0x3f3f3f3f
struct Edge {
int u, v, cap;
Edge () {}
Edge (int u, int v, int cap) : u(u), v(v), cap(cap) {}
}edge[N*N];
vector<int> G[N];
int tot, S, T, dis[N], cur[N]; void AddEdge(int u, int v, int c) {
G[u].push_back(tot);
edge[tot++] = Edge(u, v, c);
G[v].push_back(tot);
edge[tot++] = Edge(v, u, ); // 反向弧的流量是0
} int BFS() {
queue<int> que;
que.push(S);
memset(dis, INF, sizeof(dis));
dis[S] = ;
while(!que.empty()) {
int u = que.front(); que.pop();
for(int i = ; i < G[u].size(); i++) {
Edge &e = edge[G[u][i]];
if(e.cap > && dis[e.v] == INF) {
dis[e.v] = dis[u] + ;
que.push(e.v);
}
}
}
return dis[T] < INF;
} int DFS(int u, int maxflow) {
if(u == T) return maxflow;
for(int i = cur[u]; i < G[u].size(); i++) {
cur[u] = i;
Edge &e = edge[G[u][i]];
if(dis[e.v] == dis[u] + && e.cap > ) {
int flow = DFS(e.v, min(maxflow, e.cap));
if(flow) {
e.cap -= flow;
edge[G[u][i]^].cap += flow;
return flow;
}
}
}
return ;
} int Dinic() {
int ans = , flow;
while(BFS()) {
// puts("BFS");
memset(cur, , sizeof(cur));
while(flow = DFS(S, INF)) ans += flow;
}
return ans;
} int main() {
int n, f, d;
while(~scanf("%d%d%d", &n, &f, &d)) {
S = , T = * n + f + d + , tot = ;
for(int i = ; i <= T; i++) G[i].clear();
for(int i = ; i <= f; i++)
AddEdge(S, * n + i, ); // 源点到食物
for(int i = ; i <= d; i++)
AddEdge( * n + f + i, T, ); // 饮料到汇点
for(int i = ; i <= n; i++) {
int fnum, dnum;
scanf("%d%d", &fnum, &dnum);
AddEdge(i, n + i, ); // 每只牛拆点
for(int j = ; j <= fnum; j++) {
int v; scanf("%d", &v);
AddEdge( * n + v, i, ); // 食物到牛的第一个点
}
for(int j = ; j <= dnum; j++) {
int v; scanf("%d", &v);
AddEdge(n + i, * n + f + v, ); // 牛的第二个点到饮料
}
}
int ans = Dinic();
printf("%d\n", ans);
}
return ;
}

POJ 3281:Dining(最大流)的更多相关文章

  1. POJ 3281 Dining(最大流)

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

  2. POJ 3281 Dining(最大流+拆点)

    题目链接:http://poj.org/problem?id=3281 题目大意:农夫为他的 N (1 ≤ N ≤ 100) 牛准备了 F (1 ≤ F ≤ 100)种食物和 D (1 ≤ D ≤ 1 ...

  3. 【网络流#7】POJ 3281 Dining 最大流 - 《挑战程序设计竞赛》例题

    不使用二分图匹配,使用最大流即可,设源点S与汇点T,S->食物->牛->牛->饮料->T,每条边流量为1,因为流过牛的最大流量是1,所以将牛拆成两个点. 前向星,Dini ...

  4. POJ 3281 Dining(最大流板子)

    牛是很挑食的.每头牛都偏爱特定的食物和饮料,其他的就不吃了. 农夫约翰为他的牛做了美味的饭菜,但他忘了根据它们的喜好检查菜单.虽然他不可能喂饱所有的人,但他想让尽可能多的奶牛吃上一顿有食物和水的大餐. ...

  5. POJ 3281 Dining 最大流

    饮料->牛->食物. 牛拆成两点. //#pragma comment(linker, "/STACK:1024000000,1024000000") #include ...

  6. POJ 3281 Dining ( 最大流 && 建图 )

    题意 : 有 N 头牛,John 可以制作 F 种食物和 D 种饮料, 然后接下来有 N 行,每行代表一头牛的喜好==>开头两个数 Fi 和 Di 表示这头牛喜欢 Fi 种食物, Di  种饮料 ...

  7. POJ 3281 Dining (网络流)

    POJ 3281 Dining (网络流) Description Cows are such finicky eaters. Each cow has a preference for certai ...

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

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

  9. POJ 3281 Dining(最大流)

    http://poj.org/problem?id=3281 题意: 有n头牛,F种食物和D种饮料,每头牛都有自己喜欢的食物和饮料,每种食物和饮料只能给一头牛,每头牛需要1食物和1饮料.问最多能满足几 ...

  10. POJ 3281 Dining 网络流最大流

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

随机推荐

  1. Js闭包常见三种用法

        Js闭包特性源于内部函数可以将外部函数的活动对象保存在自己的作用域链上,所以使内部函数的可以将外部函数的活动对象占为己有,可以在外部函数销毁时依然存有外部函数内的活动对象内容,这样做的好处是可 ...

  2. phpmyadmin任意文件包含漏洞分析(含演示)

    0x01 漏洞描述 phpmyadmin是一款应用非常广泛的mysql数据库管理软件,基于PHP开发. 最新的CVE-2014-8959公告中,提到该程序多个版本存在任意文件包含漏洞,影响版本如下: ...

  3. 第 2 章 让jsp说hello

    2.1. 另一个简单jsp 上一篇举的例子很单纯,无论谁向服务器发送请求,服务器都只计算当前系统时间,然后把这个时间制作成http响应发还给浏览器. 可惜这种单向的响应没办法实现复杂的业务,比如像这样 ...

  4. div自定义的滚动条 (水平导航条)

    <!DOCTYPE html> <html> <head> <title></title> <style> div{ /* wi ...

  5. 火狐插件 Http请求利器 Httprequester

    搜索并且下载Httprequester

  6. java AES 加密与解密

    package com.ss.util.secret;   import java.io.UnsupportedEncodingException; import java.security.Inva ...

  7. PowerDesigner 15.2入门学习 二

    PowerDesigner中如何生成主键和自增列 1.SQL Server版本: 第一步,首先要建立与数据库的连接,方法较多,这里举个例子: http://www.cnblogs.com/netsql ...

  8. request实现页面包含

    package cn.itcast.request; import java.io.IOException; import javax.servlet.ServletException; import ...

  9. C#网络编程之--TCP协议(一)

    TCP 是面向连接的传输协议 面向连接,其实就好比,A打电话给B,如果B接听了,那么A和B之间就的通话,就是面向连接的 TCP 是全双工的传输协议 全双工,这个理解起来也很简单,A打电话给B,B接听电 ...

  10. Codevs 1299 切水果

    题目链接 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 简单的说,一共N个水果排成一排,切M次,每次切[L,R]区间的所有水果 ...