POJ 3281 网络流 拆点 Dining
题意:
有F种食物和D种饮料,每头牛有各自喜欢的食物和饮料,而且每种食物或者饮料只能给一头牛。
求最多能有多少头牛能同时得到它喜欢的食物或者饮料。
分析:
把每个牛拆点,中间连一条容量为1的边,保证一头牛不会被多个食物或者饮料分配。
然后把饮料和牛连边,食物和另外一边的牛连边,最后增加一个源点和汇点跑最大流。
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <vector>
- #include <queue>
- using namespace std;
- const int maxn = + ;
- const int maxnode = + ;
- const int INF = 0x3f3f3f3f;
- int N, F, D;
- int n, s, t;
- struct Edge
- {
- int from, to, cap, flow;
- Edge(int u, int v, int c, int f):from(u), to(v), cap(c), flow(f) {}
- };
- vector<Edge> edges;
- vector<int> G[maxnode];
- void init()
- {
- edges.clear();
- for(int i = ; i < n; i++) G[i].clear();
- }
- void AddEdge(int u, int v, int c)
- {
- edges.push_back(Edge(u, v, c, ));
- edges.push_back(Edge(v, u, , ));
- int m = edges.size();
- G[u].push_back(m - );
- G[v].push_back(m - );
- }
- bool vis[maxnode];
- int d[maxnode];
- int cur[maxnode];
- bool BFS()
- {
- d[s] = ;
- queue<int> Q;
- Q.push(s);
- memset(vis, false, sizeof(vis));
- vis[s] = true;
- while(!Q.empty())
- {
- int u = Q.front(); Q.pop();
- for(int i = ; i < G[u].size(); i++)
- {
- Edge& e = edges[G[u][i]];
- int v = e.to;
- if(!vis[v] && e.cap > e.flow)
- {
- vis[v] = true;
- d[v] = d[u] + ;
- Q.push(v);
- }
- }
- }
- return vis[t];
- }
- int DFS(int u, int a)
- {
- if(u == t || a == ) return a;
- int flow = , f;
- for(int& i = cur[u]; i < G[u].size(); i++)
- {
- Edge& e = edges[G[u][i]];
- int v = e.to;
- if(d[v] == d[u] + && (f = DFS(v, min(a, e.cap - e.flow))) > )
- {
- flow += f;
- e.flow += f;
- a -= f;
- edges[G[u][i]^].flow -= f;
- if(a == ) break;
- }
- }
- return flow;
- }
- int Maxflow()
- {
- int flow = ;
- while(BFS())
- {
- memset(cur, , sizeof(cur));
- flow += DFS(s, INF);
- }
- return flow;
- }
- int main()
- {
- while(scanf("%d%d%d", &N, &F, &D) == )
- {
- n = N * + D + F + ;
- s = , t = n - ;
- init();
- //build graph
- 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++) AddEdge(i, i + N, );
- for(int i = ; i <= N; i++)
- {
- int f, d, x; scanf("%d%d", &f, &d);
- while(f--)
- {
- scanf("%d", &x);
- AddEdge(N*+x, i, );
- }
- while(d--)
- {
- scanf("%d", &x);
- AddEdge(N + i, N*+F+x, );
- }
- }
- printf("%d\n", Maxflow());
- }
- return ;
- }
代码君
POJ 3281 网络流 拆点 Dining的更多相关文章
- POJ 3281 网络流 拆点保证本身只匹配一对食物和饮料
如何建图? 最开始的问题就是,怎么表示一只牛有了食物和饮料呢? 后来发现可以先将食物与牛匹配,牛再去和饮料匹配,实际上这就构成了三个层次. 起点到食物层边的容量是1,食物层到奶牛层容量是1,奶牛层到饮 ...
- poj 3281(网络流+拆点)
题目链接:http://poj.org/problem?id=3281 思路:设一个超级源点和一个超级汇点,源点与食物相连,饮料与汇点相连,然后就是对牛进行拆点,一边喜欢的食物相连,一边与喜欢的饮料相 ...
- POJ 3281 网络流dinic算法
B - Dining Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit S ...
- B - Dining POJ - 3281 网络流
Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will c ...
- ACM Computer Factory POJ - 3436 网络流拆点+路径还原
http://poj.org/problem?id=3436 每台电脑有$p$个组成部分,有$n$个工厂加工电脑. 每个工厂对于进入工厂的半成品的每个组成部分都有要求,由$p$个数字描述,0代表这个部 ...
- POJ 3281 网络流
题意: 思路: 网络流 重在建图- 建完了图 就一切都好说了 这道题 我的想法是 先把源点和所有的食品连上边 (容量为1) 再把食品和对应的奶牛连上边 (容量为1) 这个时候要拆点 因为每只奶牛只能才 ...
- POJ 3281 [网络流dinic算法模板]
题意: 农场主有f种食物,d种饮料,n头牛. 接下来的n行每行第一个数代表第i头牛喜欢吃的食物数量,和第i头牛喜欢喝的饮料数目. 接下来分别是喜欢的食物和饮料的编号. 求解:农场主最多能保证几头牛同时 ...
- poj 3281 Dining 网络流-最大流-建图的题
题意很简单:JOHN是一个农场主养了一些奶牛,神奇的是这些个奶牛有不同的品味,只喜欢吃某些食物,喝某些饮料,傻傻的John做了很多食物和饮料,但她不知道可以最多喂饱多少牛,(喂饱当然是有吃有喝才会饱) ...
- POJ 3281 Dining (网络流)
POJ 3281 Dining (网络流) Description Cows are such finicky eaters. Each cow has a preference for certai ...
随机推荐
- restful之http讲解
HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则.计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从HTTP服务器(Web服务器)请求 ...
- [选择排序] 时间复杂度O(n^2)
思路:从未排序的序列中,找到最小的元素,放到序列的起始位置, 再从剩下没排序的里面,找到最小的,放到已经排序的末尾. 原地操作几乎是选择排序的唯一优点,当空间复杂度要求较高时,可以考虑选择排序:实际适 ...
- freebsd快速删除磁盘数据
At the start, mark all system disks as empty. Repeat the following command for each hard drive: dd i ...
- 使用poi或jxl,通过java读写xls、xlsx文档
package nicetime.com.baseutil; import jxl.Sheet;import jxl.Workbook;import jxl.read.biff.BiffExcepti ...
- web端 repeat和简单控件
<%@ %> - 这里面写一些声明和引用的<% %> - 编写C#代码的<%= %><%# %> Repeater - 重复器 相当于winfo ...
- 卓越管理的实践技巧(3)推动团队管理的要点 Facilitation Essentials for Managers
Facilitation Essentials for Managers 前文卓越管理的秘密(Behind Closed Doors)最后一部分提到了总结的13条卓越管理的实践技巧并列出了所有实践技巧 ...
- jquery绑定事件的系统参数传递方法
如果是传递的事件自带函数,,可使用以下语法(以鼠标移动事件为例): init: function () { $(document).on("mousemove",loginOper ...
- groups - 显示用户所在的组
总览 (SYNOPSIS) groups [OPTION]... [USERNAME]... 描述 (DESCRIPTION) --help 显示此帮助, 然后退出 --version 显示版本信息, ...
- tomcat - CPU高占用问题记录
先查询进程 top 再根据进程号,查出进程的线程 ps p 3036 -L -o pcpu,pid,tid,time,tname,cmd 得到最高使用率CPU的线程TID,转换成16进制 printf ...
- PhoneGap+JQuery Mobile移动应用开发学习笔记
最近一直在学习使用PhoneGap+JQuery Mobile的开发框架开发Android应用,抛开这个框架的运行效率不说,暂且将使用中遇到的问题进行一下整理. 1.JS文件引用顺序 也许在进行web ...