传送门

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

题解:如果只是分配食物的话,那么用二分图最大匹配就好了,但遇到这种情况需要同时给一头牛分配所喜欢的食物和饮料的情况,就不能很好的处理了,可以将食物和饮料所对应的两个匹配通过下面这种方法匹配起来。

图的顶点在食物对应的匹配中的食物和牛,饮料对应的匹配中的饮料和牛之外,还有一个源点s和一个汇点t。

在两个匹配相同的牛之间连一条边,在s和所有食物,t和所有饮料之间连一条边。

边的方向为s->食物->牛->牛->饮料->t,容量全都为1。

这个图中的每一条s-t路径都对应一个牛的食物和饮料的分配方案。我们把食物所对应的牛和饮料所对应的牛拆成两个顶点,之间连一条容量为1的边,就保证了一头牛不会被分配多组食物和饮料。只要计算该图中的最大流,问题就解决了。

附上代码:


#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>using namespace std;const int MAX_N=150;
const int MAX_D=150;
const int MAX_F=150;
const int MAX_V=1000;
const int INF=0x3f3f3f3f;int N,F,D;
int likeF[MAX_N][MAX_F];
int likeD[MAX_N][MAX_D];struct edge{int to,cap,rev;edge(int _to,int _cap,int _rev):to(_to),cap(_cap),rev(_rev){}
};vector<edge>G[MAX_V];
int level[MAX_V];
int iter[MAX_V];void add_edge(int from,int to,int cap)
{G[from].push_back(edge(to,cap,G[to].size()));G[to].push_back(edge(from,0,G[from].size()-1));
}void bfs(int s)
{memset(level,-1,sizeof(level));queue<int>que;level[s]=0;que.push(s);while(!que.empty()){int v=que.front();que.pop();for(int i=0;i<G[v].size();i++){edge &e=G[v][i];if(e.cap>0&&level[e.to]<0){level[e.to]=level[v]+1;que.push(e.to);}}}
}int dfs(int v,int t,int f)
{if(v==t){return f;}for(int &i=iter[v];i<G[v].size();i++){edge &e=G[v][i];if(e.cap>0&&level[v]<level[e.to]){int d=dfs(e.to,t,min(f,e.cap));if(d>0){e.cap-=d;G[e.to][e.rev].cap+=d;return d;}}}return 0;
}int max_flow(int s,int t)
{int flow=0;for(;;){bfs(s);if(level[t]<0){return flow;}memset(iter,0,sizeof(iter));int f;while((f=dfs(s,t,INF))>0){flow+=f;}}
}void solve()
{int s=N*2+F+D,t=s+1;for(int i=0;i<F;i++){add_edge(s,N*2+i,1);}for(int i=0;i<D;i++){add_edge(N*2+F+i,t,1);}for(int i=0;i<N;i++){add_edge(i,N+i,1);for(int j=0;j<F;j++){if(likeF[i][j]){add_edge(N*2+j,i,1);}}for(int j=0;j<D;j++){if(likeD[i][j]){add_edge(N+i,N*2+F+j,1);}}}printf("%d\n",max_flow(s,t));
}int main()
{scanf("%d%d%d",&N,&F,&D);int cntf,cntd;for(int i=0;i<N;i++){scanf("%d%d",&cntf,&cntd);int temp;for(int j=0;j<cntf;j++){scanf("%d",&temp);temp--;likeF[i][temp]=1;}for(int j=0;j<cntd;j++){scanf("%d",&temp);temp--;likeD[i][temp]=1;}}solve();return 0;
}

Dining POJ - 3281 (网络流)相关推荐

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

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

  2. Dining POJ - 3281

    题意: f个食物,d杯饮料,每个牛都有想吃的食物和想喝的饮料,但食物和饮料每个只有一份 求最多能满足多少头牛.... 解析: 一道简单的无源汇拆点最大流   无源汇的一个最大流,先建立超级源s和超级汇 ...

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

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

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

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

  5. Poj 3281 Regional Chengdu Food(Dicnic)

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

  6. 1010 - 网络流 - dining(POJ 3281)

    传送门 分析 网络流板子很好敲,难就难在建模上 不过ldw老师说建模学好后,对图论很有帮助 所以,还是要好好干网络流啊 这道题建4排点,第一排是食物,第二排和第三排都是牛,第四排是饮料,然后再多个源汇 ...

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

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

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

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

  9. poj 3281 Dining 最大流

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

最新文章

  1. 计算机组成微程序设计,计算机组成原理微程序设计.doc
  2. SpringSecurity自定义UsernamePasswordAuthenticationFilter
  3. 【易创课堂】第2期开课啦,大包新年好礼成都等你
  4. 随机猜拳判断胜利(思路,逻辑正确不完美)if switch
  5. json-c库使用总结
  6. SAP C4C里嵌入SAP Analytics Cloud的案例
  7. 微信公众号接入开发者模式,服务器配置Token验证
  8. 你知道GNU C 对C语言的扩展吗?
  9. p标题/p能设置字体的大小和颜色
  10. 电脑运行java游戏,电脑运行软件卡顿?这几招游戏或是办公,让你速度飞起!...
  11. C++重载函数和重载运算符
  12. 华南理工大计算机博士毕业条件,华南理工大学博士毕业要求-2018年7月版.doc
  13. word转chm_如何免费在线将图像转换为Word?
  14. sklearn学习 6.聚类算法K-Means
  15. 个人Androidstudio快捷键及常用设置配置
  16. [Java] 蓝桥杯ALGO-11 算法训练 瓷砖铺放
  17. web操作日志丢失_日志异步落库,你了解不
  18. spss导入Excel显示连接服务器超时,Excel里的日期在spss里怎么不正常显示
  19. 【C#】创建共享项目
  20. js利用数组创建图片对象

热门文章

  1. 卡尔曼滤波最完整公式推导
  2. 语音识别-基础(一):简介【语音转文本】
  3. Efficientnet笔记:各个框架最适合的图像尺寸
  4. Testin发布众测平台 助开发者发现质量缺陷建立质量体系
  5. HTML5接入百度地图并搜索定位
  6. 手机微信广告页html代码,微信公众号h5网页被嵌入广告 不知道什么原因
  7. linux系统fasta程序,求助:如何用命令对fasta格式的序列按长短排序
  8. adb 模拟按键,调试按键,android测试可以用
  9. 上计算机课睡觉检讨书400,上自习课睡觉检讨书500字范文【三篇】
  10. 华为2285v2服务器修改SN,华为RH2285 V2服务器升级bios