题意:

NNN 个牛,FFF 种食物,DDD 种饮料,每个牛都有自己喜欢的某几种饮料和某几种食物,问最多可以让多少个牛同时得到自己喜欢的饮料和食物。每个牛只能选择一个饮料和一个食物,每个食物和饮料也只能被一头牛选择。


思路:

类似于最大匹配的题目,可以用最大流进行建图。左边是食物,连向源点,因为食物只能被选择一次,因此容量为 111。右边是饮料,连向汇点,容量也是 111。

然后来考虑牛,将牛喜欢的饮料和食物与牛连线,这样会出现一个问题,即无法保证每个牛只能选择一个饮料和一个食物,因此我们考虑到了"拆点"的做法,这也是网络流中控制流量的最常用方法。

因此我们将牛拆成两个点,左边的连食物,右边的连饮料,两个牛中间连一条容量为 111 的边,然后跑最大流即可完成本题。


代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#define rep(i,a,b) for(int i = a;i <= b;i++)
using namespace std;
const int inf = 1<<29,N = 50010,M = 300010;  //处理1e4-1e5规模的网络struct Edge{ int to,next,v;
}e[M];
int n,f,d,s,t;  //顶点个数 边数 源点 汇点
int head[N],tot,dis[N];
queue<int> q;void init()   //千万别忘了初始化!
{tot = 1; memset(head,0,sizeof head);  //点的编号是2~n,因为2^1 = 3, 3^1 = 2;  符合后续代码的操作
}void add(int x,int y,int v)
{e[++tot].to = y; e[tot].next = head[x]; e[tot].v = v; head[x] = tot;e[++tot].to = x; e[tot].next = head[y]; e[tot].v = 0; head[y] = tot;  //反向边与正向边的流量之和为v
}bool bfs()
{memset(dis,0,sizeof dis);while(!q.empty()) q.pop();q.push(s); dis[s] = 1;while(!q.empty()){int x = q.front(); q.pop();for(int i = head[x];i;i = e[i].next){if(e[i].v && !dis[e[i].to]){q.push(e[i].to);dis[e[i].to] = dis[x]+1;if(e[i].to == t) return 1;  //找到一条路就return }}}return 0;
}int dinic(int x,int flow) //找增广路
{if(x == t) return flow;int rest = flow,k;  //rest为输入的流量 for(int i = head[x];i && rest; i = e[i].next){if(e[i].v && dis[e[i].to] == dis[x]+1){k = dinic(e[i].to,min(rest,e[i].v));if(!k) dis[e[i].to] = 0;  //剪枝,去掉增广完毕的点 e[i].v -= k;e[i^1].v += k;  //反向边加上flow,相当于我们可以反悔从这条路流过 rest -= k; //k为能够被送出去的流量 }}return flow-rest;  //总共被送出去了多少流量
}int solve()
{int flow = 0,maxflow = 0;while(bfs())while((flow = dinic(s,inf))) maxflow += flow;return maxflow;
}int main()
{while(~scanf("%d%d%d",&n,&f,&d)){init();s = 1, t = 1+f+d+n+n+1;rep(i,1,f) add(s,i+1,1);rep(i,1,d) add(1+f+2*n+i,t,1);rep(i,1,n) add(1+f+i,1+f+n+i,1);rep(i,1,n){int xx,yy,tmp;scanf("%d%d",&xx,&yy);rep(j,1,xx){scanf("%d",&tmp);add(tmp+1,1+f+i,1);}rep(j,1,yy){scanf("%d",&tmp);add(1+f+n+i,1+f+2*n+tmp,1);}}printf("%d\n",solve());}return 0;
}

【POJ 3281】Dining【最大匹配、拆点】相关推荐

  1. POJ.3281 dining 最大流+拆点

    POJ.3281 dining 最大流+拆点 思路清晰为啥一直WA呢 #include <iostream> #include <cstring> #include <v ...

  2. 解题报告:POJ 3281 Dining(最大流 / “三分图”建图)

    B.POJ 3281 DiningDiningDining(最大流/建图模板)[省选/NOI- ] 有 F 种食物和 D 种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一 种食物和一种饮料.现 ...

  3. POJ 3281 -- Dining(最大流,拆点建图)

    题目链接 Description Cows are such finicky eaters. Each cow has a preference for certain foods and drink ...

  4. POJ - 3281 Dining(最大流+思维建边)

    题目链接:点击查看 题目大意:给出n头奶牛,f种食物,d种饮料,每只奶牛可以选择数种食物和饮料,但每种食物和饮料只有一份,现在问最多能让多少头奶牛同时满足食物和饮料的条件 题目分析:最大流的题目,不过 ...

  5. poj 3281 Dining 最大流

    题目链接 一开始的想法就是food-cow-water,但是wa了,看了别人的思路知道每一只牛牛用一条边隔开,然后就达到了限流的效果. 所以 食物-->牛牛---->牛牛---->w ...

  6. B - Dining POJ - 3281 -网络流拆点模板

    B - Dining POJ - 3281 题意:一些牛,每只牛有 一些  想吃的food and milk,然后问最大能够满足多少只牛. 满足是指的这头牛即能吃到他喜欢吃的又能喝到他喜欢喝的 思路: ...

  7. Poj 3281 Regional Chengdu Food(Dicnic)

    网络流最大流的优化算法Dicnic,每一步对原图进行分层,然后用DFS求增广路.时间复杂度是O(n^2*m) . Poj 3281 和 9.16号成都regional网络赛food那道题,都是很好的模 ...

  8. 【POJ - 3281】Dining(拆点建图,网络流最大流)

    题干: Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she wi ...

  9. POJ 3281 (最大流+匹配+拆点)

    题目链接:http://poj.org/problem?id=3281 题目大意:有一些牛,一堆食物,一堆饮料.一头牛要吃一份食物喝一份饮料才算满足,而且牛对某些食物和饮料才有好感,问最多有多少头牛是 ...

  10. Dining POJ - 3281 (网络流)

    传送门 题意:农夫约翰为他的N头牛准备了F种食物和D种饮料.每头牛都有各自喜欢的食物和饮料,而每种食物或饮料只能分配给一头牛.最多能有多少头牛同时得到自己喜欢的食物和饮料? 题解:如果只是分配食物的话 ...

最新文章

  1. 测试hadoop安装是否成功
  2. bootstrap-关闭按钮
  3. c++图的创建_使用 Amazon Neptune 构建基于图数据库的应用
  4. 数学建模——支持向量机模型详解Python代码
  5. 中国在线英语培训行业投资热点分析与需求前景预测报告2022版
  6. 阿里P8架构师谈:阿里双11秒杀系统如何设计?
  7. 数组序列化 java_Java基础之数组序列化、反序列化 小发现(不知道 是不是有问题)...
  8. linux chattr 无权限,从零开始学习Linux(二十八):文件权限之chattr权限
  9. hashtable和hashmap的区别?
  10. mybatis框架增删改的注意事项 ,不同数据库取消转义的方法
  11. ActivityManager Displayed 源码位置
  12. LM324运放器应用实例
  13. html 鼠标右击事件,鼠标右击事件(练习)
  14. Unity 3D学习(基础篇)——C#基础入门
  15. 华为千元旗舰迎GPU Turbo会员不限量升级,这件事很“吓人”
  16. 我对马斯洛需求层次的理解
  17. 以太坊中的nonce
  18. 中学计算机课小课题,小学信息技术学科小课题结题统计表已结题23个一等奖3.doc...
  19. Android实战开发-Kotlin教程(入门篇-RecyclerView数据列表的实现)
  20. 2021年 西邮Linux兴趣小组 纳新免试题揭秘

热门文章

  1. 2010.11.18 关于向窗口发送消息
  2. 如何参加GoToMeeting在线会议
  3. mysql dump 拒绝访问_Delphi开发的数据库程序在C:\PDOXUSRS.NET生成文件,拒绝访问及读写权限...
  4. const定义常量_JS声明变量var、let 、const(含重点示例)
  5. python是免费的、开源的、跨平台的_推荐:3款开源的Python IDE
  6. maker 预测_Nature | 计算机首次预测天然产物逆合成路线—与人类不相上下!
  7. 【HDU1277】全文检索(ac自动机/字典树)
  8. 【浙江第16届省赛:B】Element Swapping(分情况讨论--数学题)
  9. dio设置自定义post请求_Flutter用dio封装http网络请求,设置统一的请求地址、headers及处理返回内容...
  10. beego mysql增删改查_5-BeegoORM增删改查-Go语言中文社区