http://poj.org/problem?id=3281

题目大意:

N牛,F种吃的D种喝的,牛可以在它喜欢的吃的喝的选一组,之后就不能选这个吃的喝的。

问最多满足多少人。

————————————————————————————

开始想过贼麻烦的方法,然后确认一下是否对查了题解。

……思想是对的,但建图建麻烦了。

这题的关键在于如何判断奶牛和吃喝是否被用过的同时保证牛能连上他喜欢的吃喝。

我们用对称性解决:

奶牛拆点,左边连吃,右边连喝,喝连汇点,吃连源点。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
const int INF=2147483640;
const int maxn=510;
inline int read(){int X=0,w=0; char ch=0;while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
int S,T;
struct node{int nxt;int to;int w;
}edge[maxn*maxn];
int head[maxn],cnt=-1;
void add(int u,int v,int w){ cnt++;edge[cnt].to=v;edge[cnt].w=w;edge[cnt].nxt=head[u];head[u]=cnt;return;
}
int lev[maxn],cur[maxn];
bool bfs(int m){int dui[m],r=0; for(int i=1;i<=m;i++){lev[i]=-1;cur[i]=head[i];}dui[0]=1,lev[1]=0;int u,v;for(int l=0;l<=r;l++){ u=dui[l];for(int e=head[u];e!=-1;e=edge[e].nxt){v=edge[e].to;if(edge[e].w>0&&lev[v]==-1){lev[v]=lev[u]+1;r++;dui[r]=v;if(v==m)return 1;}}}return 0;
}
int dinic(int u,int flow,int m){if(u==m)return flow;int res=0,delta;for(int &e=cur[u];e!=-1;e=edge[e].nxt){int v=edge[e].to;if(edge[e].w>0&&lev[u]<lev[v]){delta=dinic(v,min(edge[e].w,flow-res),m); if(delta>0){edge[e].w-=delta;edge[e^1].w+=delta;res+=delta;if(res==flow)break;}}}if(res!=flow)lev[u]=-1;return res;
}
int main(){memset(head,-1,sizeof(head));int N=read();int F=read();int D=read();S=1;T=2*N+F+D+2;for(int i=1;i<=F;i++){add(S,i+1,1);add(i+1,S,0);}for(int i=1;i<=N;i++){int s=i+F+1,e=i+F+N+1;add(s,e,1);add(e,s,0);}for(int i=1;i<=D;i++){int s=i+N*2+F+1;add(s,T,1);add(T,s,0);}for(int i=1;i<=N;i++){int f=read();int d=read();for(int j=1;j<=f;j++){int s=read()+1;int e=i+F+1;add(s,e,1);add(e,s,0);}for(int j=1;j<=d;j++){int s=i+F+N+1;int e=read()+N*2+F+1;add(s,e,1);add(e,s,0);}}int ans=0;while(bfs(T))ans+=dinic(1,INF,T);printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/luyouqi233/p/7941891.html

POJ3281:Dining——题解相关推荐

  1. 解题报告 之 POJ3281 Dining

    解题报告 之 POJ3281 Dining Description Cows are such finicky eaters. Each cow has a preference for certai ...

  2. POJ-3281 Dining 网络流最大流

    Dining 题意: 现在有一个养牛场厂主,他有F种食物,D种水,每种都只有一份. 现在他有n头牛,每种牛需要吃一份食物,一种水,对于每头牛来说 食物都有Fi种选项,水有Di种选项,各自都需要选一种. ...

  3. poj3281 Dining (最大流)

    问题描述 牛是很挑食的.每头牛都偏爱特定的食物和饮料,其他的她都不吃. 农夫约翰为他的牛做了美味的饭菜,但他忘了根据它们的喜好检查菜单.虽然他可能不能填饱所有的人,但他想给尽可能多的奶牛提供一顿完整的 ...

  4. poj3281 - Dining

    想看更多的解题报告:http://blog.csdn.net/wangjian8006/article/details/7870410                                  ...

  5. Dinic求最大流/最小割

    o(v^2*E) 建图时建一条流量为0的反向边,正向边每减去流量f,反向边增加流量f.对于无向图当做两条边. cap:每条边最大流量 建图后: 调用DINIC():用bfs()为每个节点进行层次编号, ...

  6. 【POJ3281】Dining 网络流

    题意:n牛m食品p饮品 第牛有ai种可行食品,bi种可行饮品 现在进行搭配,一头牛如果既有一份可行食品又有一份可行饮品就称为被满足. 求最多满足. 题解: 别忘了牛拆点. 代码: #include & ...

  7. P2837 [USACO08FEB]Dining Cows B 题解

    怎么感觉没几个题解是写DP的呢?难道这真的是道假DP? 如果用DP其实很好想啊,用dp[i][0]表示第i头奶牛为1时需改的最小数量,dp[i][1]表示第i头奶牛为2时需改的最小数量, 如果第i头奶 ...

  8. 【CF1179 A,B,C】Valeriy and Deque / Tolik and His Uncle / Serge and Dining Room

    还好题很温柔,温柔得我差点没做完 文章目录 A:Valeriy and Deque 题意 题解 代码实现 B:Tolik and His Uncle 题目 题解 代码实现 C:Serge and Di ...

  9. 【BZOJ1226/SDOI2009】学校食堂Dining

    1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec  Memory Limit: 259 MB                                 ...

最新文章

  1. 定点量化误差python仿真.零极点(1)
  2. 局域网读取文件_教你windows局域网如何设置共享文件
  3. Lesson 6.动态计算图与梯度下降入门
  4. FTP 500 OOPS
  5. opencv java 显示图片_【opencv三】利用opencv读取显示图片
  6. svn switch 导致个别文件switch失败
  7. tomcat配置https,单方验证,并自动将http请求转成https
  8. 苹果新闻订阅服务Apple News +推出48小时获得逾20万用户
  9. python中字典的用法_Python字典操作用法总结
  10. 编译aspell时出错
  11. 最详细的JavaScript高级教程(一)简介
  12. vue 开发App监听手机 返回键返回上级路由以及退出
  13. ROS ros::NodeHandle nh(“~“)
  14. 去掉window.print()去除页眉页脚及网址
  15. Win系统 - 微信居然自带修复工具?快来试试
  16. 用c语言求五位回文数,C语言求回文数(详解版)
  17. 如何利用PDF格式转换器在手机上完成PDF格式转换
  18. 带你入门多目标跟踪(四)外观模型 Appearance Model
  19. LoadLibrary下错误返回126错误码排查过程
  20. mysql中存储gis数据类型_GIS数据格式及存储方式的基本概念

热门文章

  1. c语言 wchar_t,一个【wchar_t】引发的学案
  2. sql和mysql同时配置_jfinal同时配置mssql和mysql混动数据源
  3. python怎么绘制坐标图像_如何使用给定的坐标和python opencv在图像中绘制点?
  4. python判断回文_Python实现判断一个整数是否为回文数算法示例
  5. android 传输日期,Android 跟日期和时间有关的操作
  6. fastdfs上传文件_Java 实现 FastDFS 实现文件的上传、下载、删除
  7. axure轮播图怎么设置循环轮播_Axure教程:轮播图制作步骤详解
  8. 语料库与python应用_语料库与Python应用/语料库翻译学文库
  9. 一台服务器上使用docker安装redis6.0.10一主两从以及哨兵模式
  10. halcon像素统计_Halcon一日一练:图像分辨率与像素