poj3281(最大流)
传送门:Dining
题意:一些牛,一些食物,一些饮料,每头牛都有其喜欢的几种食物和几种饮料,求最多能给多少头牛即找到食物又找到饮料~也就是有多少个 牛---食物---饮料 的匹配,而且满足一一匹配,每个牛,食物,或饮料都只能使用一次。
分析:如果直接源点-食物-牛-汇点这样建图,那么可能会很多份食物通过某头牛传送过去,不能保证每头牛吃一份食物,因此拆点,把每头牛拆成牛-牛,边权为1,这样就能保证每头牛只能吃一份了。
- #pragma comment(linker,"/STACK:1024000000,1024000000")
- #include <cstdio>
- #include <cstring>
- #include <string>
- #include <cmath>
- #include <limits.h>
- #include <iostream>
- #include <algorithm>
- #include <queue>
- #include <cstdlib>
- #include <stack>
- #include <vector>
- #include <set>
- #include <map>
- #define LL long long
- #define mod 100000000
- #define inf 0x3f3f3f3f
- #define eps 1e-6
- #define N 500
- #define lson l,m,rt<<1
- #define rson m+1,r,rt<<1|1
- #define PII pair<int,int>
- using namespace std;
- inline int read()
- {
- char ch=getchar();
- int x=,f=;
- while(ch>''||ch<''){if(ch=='-')f=-;ch=getchar();}
- while(ch<=''&&ch>=''){x=x*+ch-'';ch=getchar();}
- return x*f;
- }
- int n,d,f,vs,vt,tot;
- int pre[N],q[N],cur[N],h[N];
- struct edge
- {
- int v,w,next;
- edge(){}
- edge(int v,int w,int next):v(v),w(w),next(next){}
- }e[N*N];
- void addedge(int u,int v,int w)
- {
- e[tot]=edge(v,w,pre[u]);
- pre[u]=tot++;
- }
- void init()
- {
- memset(pre,-,sizeof(pre));
- tot=;
- }
- /*******************dinic************************/
- int bfs()
- {
- int head=,tail=;
- memset(h,-,sizeof(h));
- q[]=vs;h[vs]=;
- while(head!=tail)
- {
- int u=q[head++];
- for(int i=pre[u];~i;i=e[i].next)
- {
- int v=e[i].v,w=e[i].w;
- if(w&&h[v]==-)
- {
- h[v]=h[u]+;
- q[tail++]=v;
- }
- }
- }
- return h[vt]!=-;
- }
- int dfs(int u,int flow)
- {
- if(u==vt)return flow;
- int used=;
- for(int i=cur[u];~i;i=e[i].next)
- {
- int v=e[i].v,w=e[i].w;
- if(h[v]==h[u]+)
- {
- w=dfs(v,min(flow-used,w));
- e[i].w-=w;e[i^].w+=w;
- if(e[i].w)cur[u]=i;
- used+=w;
- if(used==flow)return flow;
- }
- }
- if(!used)h[u]=-;
- return used;
- }
- int dinic()
- {
- int res=;
- while(bfs())
- {
- for(int i=vs;i<=vt;i++)cur[i]=pre[i];
- res+=dfs(vs,inf);
- }
- return res;
- }
- /********************dinic***********************/
- void build()
- {
- vs=;vt=n*+f+d+;
- for(int i=;i<=f;i++)addedge(vs,i,),addedge(i,vs,);
- for(int i=;i<=d;i++)addedge(i+*n+f,vt,),addedge(vt,i+*n+f,);
- for(int i=;i<=n;i++)addedge(f+i,f+n+i,),addedge(f+n+i,f+i,);
- for(int i=;i<=n;i++)
- {
- int m1,m2,x;
- m1=read();m2=read();
- while(m1--)
- {
- x=read();
- addedge(x,f+i,);
- addedge(f+i,x,);
- }
- while(m2--)
- {
- x=read();
- addedge(f+n+i,f+*n+x,);
- addedge(f+*n+x,f+n+i,);
- }
- }
- }
- int main()
- {
- while(scanf("%d%d%d",&n,&f,&d)>)
- {
- init();
- build();
- printf("%d\n",dinic());
- }
- }
poj3281(最大流)的更多相关文章
- POJ-3281(最大流+EK算法)
Dining POJ-3281 这道题目其实也是网络流中求解最大流的一道模板题. 只要建模出来以后直接套用模板就行了.这里的建模还需要考虑题目的要求:一种食物只能给一只牛. 所以这里可以将牛拆成两个点 ...
- POJ3281 Dining —— 最大流 + 拆点
题目链接:https://vjudge.net/problem/POJ-3281 Dining Time Limit: 2000MS Memory Limit: 65536K Total Subm ...
- Dining(POJ-3281)【最大流】
题目链接:https://vjudge.net/problem/POJ-3281 题意:厨师做了F种菜各一份,D种饮料各一份,另有N头奶牛,每只奶牛只吃特定的菜和饮料,问该厨师最多能满足多少头奶牛? ...
- POJ3281 Dining(拆点构图 + 最大流)
题目链接 题意:有F种食物,D种饮料N头奶牛,只能吃某种食物和饮料(而且只能吃特定的一份) 一种食物被一头牛吃了之后,其余牛就不能吃了第一行有N,F,D三个整数接着2-N+1行代表第i头牛,前面两个整 ...
- POJ3281 Dining 最大流
题意:有f种菜,d种饮品,每个牛有喜欢的一些菜和饮品,每种菜只能被选一次,饮品一样,问最多能使多少头牛享受自己喜欢的饮品和菜 分析:建边的时候,把牛拆成两个点,出和入 1,源点向每种菜流量为1 2,每 ...
- poj-3281(拆点+最大流)
题意:有n头牛,f种食物,d种饮料,每头牛有自己喜欢的食物和饮料,问你最多能够几头牛搭配好,每种食物或者饮料只能一头牛享用: 解题思路:把牛拆点,因为流过牛的流量是由限制的,只能为1,然后,食物和牛的 ...
- 2018.06.27 POJ3281 Dining(最大流)
Dining Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21578 Accepted: 9545 Description C ...
- POJ3281(KB11-B 最大流)
Dining Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 19170 Accepted: 8554 Descripti ...
- poj3281网络流之最大流
加一个源点和汇点,把每头牛拆成两个点,不拆点的话可能会出现多对食物与饮料被一个牛享用的情况,拆点后流量为1,不能同时通过了 然后用最大流处理,每个链接边都是1 #include<map> ...
- [poj3281]Dining(最大流+拆点)
题目大意:有$n$头牛,$f$种食物和$d$种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料.每头牛都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几头牛同时享用到自己喜欢 ...
随机推荐
- [REST Jersey] @QueryParam Demo
This demo sourced from the jersey tutor. https://jersey.java.net/documentation/latest/jaxrs-resource ...
- poj3278Catch That Cow(BFS)
Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 37094 Accepted: 11466 ...
- sql: 查询,select
快速查询数据库中拥有那些表项:(类似linux中的ls, ls |grep table_name*)select * from tab where tname like 'YOUR_QERYNAME% ...
- Spring3.0 入门进阶(1):从配置文件装载Bean
Spring 已经盛行多年,目前已经处于3.0阶段,关于Spring的概念介绍性的东西网上已经很多,本系列博客主要是把一些知识点通过代码的方式总结起来,以便查阅. 作为入门,本篇主要介绍Bean的加载 ...
- 最新 Druid 配置
Druid是一个JDBC组件库,包括数据库连接池.SQL Parser等组件.DruidDataSource是最好的数据库连接池.下面我们就一起来在项目中配置Druid吧 1.Druid依赖配置 &l ...
- 在JDBC中使用PreparedStatement代替Statement,同时预防SQL注入
本篇讲诉为何在JDBC操作数据库的过程中,要使用PreparedStatement对象来代替Statement对象. 在前面的JDBC学习中,对于Statement对象,我们已经知道是封装SQL语句并 ...
- Office 2013 正式版 下载地址 带正版验证
万众期待的正式版Office 2013 降临---英文版/中文简体版 英文版软件下载地址: office_professional_plus_2013_x86_dvd en_office_profes ...
- 积累的VC编程小技巧之按钮
1.资源种创建的控件,对其属性的动态控制: 在对话框类的头文件里创建所要改变属性的控件的对象,如要改变一个Button(其ID为IDC_MyButton)的属性,则需创建Cbutton的对象m_but ...
- 【Node.js 自己封装的库 http_parse, libuv】
[Node.js 自己封装的库 http_parse, libuv] Node.js 介绍:一个网络框架,更多:http://www.oschina.net/p/nodejs 官网:http://no ...
- Database Connection Pool Library | Libzdb
Database Connection Pool Library | Libzdb A small, easy to use Open Source Database Connection Pool ...