poj-3281(拆点+最大流)
题意:有n头牛,f种食物,d种饮料,每头牛有自己喜欢的食物和饮料,问你最多能够几头牛搭配好,每种食物或者饮料只能一头牛享用;
解题思路:把牛拆点,因为流过牛的流量是由限制的,只能为1,然后,食物和牛的入点相连,牛的出点和饮料相连,求解最大流
代码:
- #include<iostream>
- #include<algorithm>
- #include<cstring>
- #include<cstdio>
- #include<queue>
- using namespace std;
- const int maxn=200500;
- const int inf=0x3f3f3f3f;
- struct Edge
- {
- int fa;
- int next;
- int to;
- int w;
- }edge[maxn];
- int n,m,f,d;
- int head[maxn];
- int cnt,Start,End;
- int x,y,w;
- int depth[maxn];
- void add(int u,int v,int w)
- {
- //cout<<u<<" "<<v<<endl;
- edge[cnt].next=head[u];edge[cnt].fa=u;
- edge[cnt].to=v;edge[cnt].w=w;head[u]=cnt++;
- edge[cnt].next=head[v];edge[cnt].fa=v;
- edge[cnt].to=u;edge[cnt].w=0;head[v]=cnt++;
- }
- bool bfs()//分层;
- {
- memset(depth,0,sizeof(depth));
- queue<int>q;
- q.push(Start);
- depth[Start]=1;
- while(!q.empty())
- {
- int temp=q.front();
- q.pop();
- for(int i=head[temp];i!=-1;i=edge[i].next)
- {
- int v=edge[i].to;
- if(depth[v]||edge[i].w<=0)
- continue;
- depth[v]=depth[temp]+1;
- q.push(v);
- }
- }
- return depth[End];//若为0表示没法到达也就是没有路径了;
- }
- int dfs(int u,int maxflow)
- {
- if(u==End)
- return maxflow;
- int add=0;
- for(int i=head[u];i!=-1&&add<maxflow;i=edge[i].next)
- {
- int v=edge[i].to;
- if(depth[v]!=depth[u]+1)
- continue;
- if(edge[i].w==0)
- continue;
- int tempflow=dfs(v,min(edge[i].w,maxflow-add));
- edge[i].w-=tempflow;
- edge[i^1].w+=tempflow;
- add+=tempflow;
- }
- return add;
- }
- int dinic()
- {
- int ans=0;
- while(bfs())
- {
- ans+=dfs(Start,0x3f3f3f3f);
- }
- return ans;
- }
- int main()
- {
- int tmp;
- memset(head,-1,sizeof(head));
- scanf("%d%d%d",&n,&f,&d);
- Start=0;End=2*n+f+d+1;
- for(int i=1;i<=n;i++)
- add(i,i+n,1);
- for(int i=2*n+1;i<=2*n+f;i++)
- add(Start,i,1);
- for(int i=2*n+f+1;i<=2*n+f+d;i++)
- add(i,End,1);
- for(int i=1;i<=n;i++)
- {
- scanf("%d%d",&x,&y);
- for(int j=1;j<=x;j++)
- {
- scanf("%d",&tmp);
- add(tmp+2*n,i,1);
- }
- for(int j=1;j<=y;j++)
- {
- scanf("%d",&tmp);
- add(i+n,tmp+2*n+f,1);
- }
- }
- int ans=dinic();
- printf("%d\n",ans);
- }
poj-3281(拆点+最大流)的更多相关文章
- poj 3281 Dining 网络流-最大流-建图的题
题意很简单:JOHN是一个农场主养了一些奶牛,神奇的是这些个奶牛有不同的品味,只喜欢吃某些食物,喝某些饮料,傻傻的John做了很多食物和饮料,但她不知道可以最多喂饱多少牛,(喂饱当然是有吃有喝才会饱) ...
- POJ 3281 Dining(最大流)
http://poj.org/problem?id=3281 题意: 有n头牛,F种食物和D种饮料,每头牛都有自己喜欢的食物和饮料,每种食物和饮料只能给一头牛,每头牛需要1食物和1饮料.问最多能满足几 ...
- poj 3281 Dining【最大流】
记得把牛拆掉!拆成两个点i和i'在中间连一条流量为1的边,来限制每头牛只能选一组 一般来讲是一种物品一个消费者各占一边,但是这里有两个物品,所以考虑把牛放在中间,s向所有的食物连流量为1的边,所有食物 ...
- POJ 3281 Dining 网络流最大流
B - DiningTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.ac ...
- poj 3281 最大流+建图
很巧妙的思想 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/21/2649850.html 本题能够想到用最大流做,那真的是太绝了.建模的方法很 ...
- POJ 3281 Dining(最大流)
POJ 3281 Dining id=3281" target="_blank" style="">题目链接 题意:n个牛.每一个牛有一些喜欢的 ...
- poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap
poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分 dinic /* * Author: yew1eb * Created Time: 2014年10月31日 星期五 ...
- POJ 3281 网络流 拆点保证本身只匹配一对食物和饮料
如何建图? 最开始的问题就是,怎么表示一只牛有了食物和饮料呢? 后来发现可以先将食物与牛匹配,牛再去和饮料匹配,实际上这就构成了三个层次. 起点到食物层边的容量是1,食物层到奶牛层容量是1,奶牛层到饮 ...
- POJ 3281 Dining (网络流)
POJ 3281 Dining (网络流) Description Cows are such finicky eaters. Each cow has a preference for certai ...
- POJ 3281 网络流dinic算法
B - Dining Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit S ...
随机推荐
- JavaScript 代码简洁之道
摘要: 可以说是<Clean Code>的JS代码示例了,值得参考. 原文:JavaScript 代码简洁之道 作者:缪宇 Fundebug经授权转载,版权归原作者所有. 测试代码质量的唯 ...
- android如何获取SHA1
某些Google Play服务(例如Google登录和App Invites)要求我们提供签名证书的SHA-1,以便google paly为我们的应用创建OAuth2客户端和API密钥. 那么如何获取 ...
- 2019Java查漏补缺(一)
看到一个总结的知识: 感觉很全面的知识梳理,自己在github上总结了计算机网络笔记就很累了,猜想思维导图的方式一定花费了作者很大的精力,特共享出来.原文:java基础思维导图 自己学习的查漏补缺如下 ...
- Django 事务操作
如何在Django中进行事务操作 案例: 客户A要给客户B转一笔钱,这个在数据库中需要进行两步: 1.客户A减钱 2.客户B加钱 如果在第一步结束后,服务器出现异常,停下了,第二步没有进行,如果数据库 ...
- Kafka相关内容总结(概念和原理)
说明 主要内容是在网上的一些文章中整理出来: 加粗的字体是比较重要的内容,部分是自己的经验和理解: 整理的目的主要是为了方便查阅: 为什么需要消息系统 解耦: 在项目启动之初来预测将来项目会碰到什么需 ...
- 【公众号系列】SAP的新零售
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[公众号系列]SAP的新零售 写在前面 还是 ...
- 伙伴系统之伙伴系统概述--Linux内存管理(十五)
在内核初始化完成之后, 内存管理的责任就由伙伴系统来承担. 伙伴系统基于一种相对简单然而令人吃惊的强大算法. Linux内核使用二进制伙伴算法来管理和分配物理内存页面, 该算法由Knowlton设计, ...
- c/c++ 多线程 unique_lock的使用
多线程 unique_lock的使用 unique_lock的特点: 1,灵活.可以在创建unique_lock的实例时,不锁,然后手动调用lock_a.lock()函数,或者std::lock(lo ...
- "'cl' 不是内部或外部命令,也不是可运行的程序"解决方案
最近使用VS2012+Qt5.1+QtCreator2.8.1来搭建Qt的开发环境(之前有用MinGW编译的经历,经常碰到gdb调试器崩溃的问题),全部换成想用VC的编译器和调试环境,但是觉得QtCr ...
- 三机互ping(自己总结)
主机与虚拟机互ping设置: 点击VMware下的[编辑]--[虚拟网络编辑器]设置如下: 屏幕剪辑的捕获时间: 2016/5/21 13:10 屏幕剪辑的捕获时间: ...