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

题目大意:

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

问最多满足多少人。

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

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

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

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

我们用对称性解决:

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

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<cctype>
  7. using namespace std;
  8. const int INF=;
  9. const int maxn=;
  10. inline int read(){
  11. int X=,w=; char ch=;
  12. while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
  13. while(isdigit(ch)) X=(X<<)+(X<<)+(ch^),ch=getchar();
  14. return w?-X:X;
  15. }
  16. int S,T;
  17. struct node{
  18. int nxt;
  19. int to;
  20. int w;
  21. }edge[maxn*maxn];
  22. int head[maxn],cnt=-;
  23. void add(int u,int v,int w){
  24. cnt++;
  25. edge[cnt].to=v;
  26. edge[cnt].w=w;
  27. edge[cnt].nxt=head[u];
  28. head[u]=cnt;
  29. return;
  30. }
  31. int lev[maxn],cur[maxn];
  32. bool bfs(int m){
  33. int dui[m],r=;
  34. for(int i=;i<=m;i++){
  35. lev[i]=-;
  36. cur[i]=head[i];
  37. }
  38. dui[]=,lev[]=;
  39. int u,v;
  40. for(int l=;l<=r;l++){
  41. u=dui[l];
  42. for(int e=head[u];e!=-;e=edge[e].nxt){
  43. v=edge[e].to;
  44. if(edge[e].w>&&lev[v]==-){
  45. lev[v]=lev[u]+;
  46. r++;
  47. dui[r]=v;
  48. if(v==m)return ;
  49. }
  50. }
  51. }
  52. return ;
  53. }
  54. int dinic(int u,int flow,int m){
  55. if(u==m)return flow;
  56. int res=,delta;
  57. for(int &e=cur[u];e!=-;e=edge[e].nxt){
  58. int v=edge[e].to;
  59. if(edge[e].w>&&lev[u]<lev[v]){
  60. delta=dinic(v,min(edge[e].w,flow-res),m);
  61. if(delta>){
  62. edge[e].w-=delta;
  63. edge[e^].w+=delta;
  64. res+=delta;
  65. if(res==flow)break;
  66. }
  67. }
  68. }
  69. if(res!=flow)lev[u]=-;
  70. return res;
  71. }
  72. int main(){
  73. memset(head,-,sizeof(head));
  74. int N=read();int F=read();int D=read();
  75. S=;T=*N+F+D+;
  76. for(int i=;i<=F;i++){
  77. add(S,i+,);
  78. add(i+,S,);
  79. }
  80. for(int i=;i<=N;i++){
  81. int s=i+F+,e=i+F+N+;
  82. add(s,e,);
  83. add(e,s,);
  84. }
  85. for(int i=;i<=D;i++){
  86. int s=i+N*+F+;
  87. add(s,T,);
  88. add(T,s,);
  89. }
  90. for(int i=;i<=N;i++){
  91. int f=read();int d=read();
  92. for(int j=;j<=f;j++){
  93. int s=read()+;
  94. int e=i+F+;
  95. add(s,e,);
  96. add(e,s,);
  97. }
  98. for(int j=;j<=d;j++){
  99. int s=i+F+N+;
  100. int e=read()+N*+F+;
  101. add(s,e,);
  102. add(e,s,);
  103. }
  104. }
  105. int ans=;
  106. while(bfs(T))ans+=dinic(,INF,T);
  107. printf("%d\n",ans);
  108. return ;
  109. }

POJ3281:Dining——题解的更多相关文章

  1. POJ3281 Dining —— 最大流 + 拆点

    题目链接:https://vjudge.net/problem/POJ-3281 Dining Time Limit: 2000MS   Memory Limit: 65536K Total Subm ...

  2. poj3281 Dining

    Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14316   Accepted: 6491 Descripti ...

  3. 2018.06.27 POJ3281 Dining(最大流)

    Dining Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21578 Accepted: 9545 Description C ...

  4. POJ3281 Dining 2017-02-11 23:02 44人阅读 评论(0) 收藏

    Dining Description Cows are such finicky eaters. Each cow has a preference for certain foods and dri ...

  5. [USACO07OPEN]Dining 题解

    前言 如果有人不会网络流,那么安利一下我网络最大流Dinic的博客 关于网络流,我多久没有碰这个算法了... 这是一道网络流好题. 题解 这道题目难点主要是构图. 这道题的构图一开始很容易想到建一个超 ...

  6. <每日一题>Day 9:POJ-3281.Dining(拆点 + 多源多汇+ 网络流 )

    Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 24945   Accepted: 10985 Descript ...

  7. POJ3281 Dining(拆点构图 + 最大流)

    题目链接 题意:有F种食物,D种饮料N头奶牛,只能吃某种食物和饮料(而且只能吃特定的一份) 一种食物被一头牛吃了之后,其余牛就不能吃了第一行有N,F,D三个整数接着2-N+1行代表第i头牛,前面两个整 ...

  8. POJ3281 Dining 最大流

    题意:有f种菜,d种饮品,每个牛有喜欢的一些菜和饮品,每种菜只能被选一次,饮品一样,问最多能使多少头牛享受自己喜欢的饮品和菜 分析:建边的时候,把牛拆成两个点,出和入 1,源点向每种菜流量为1 2,每 ...

  9. POJ3281:Dining(dinic+拆点)

    题目链接:http://poj.org/problem?id=3281 PS:刷够网络流了,先这样吧,之后再刷,慢慢补. 题意:有F种食物,D种饮料,N头奶牛,只能吃某种食物和饮料(而且只能吃特定的一 ...

随机推荐

  1. dsp6657的串口学习

    1. 打算用dsp6657学习下,先用串口实验吧.找一下芯片支持库Chip support libraries,路径D:\ti\pdk_C6657_1_1_1_4\packages\ti\csl,新建 ...

  2. long 与int 比较问题

    long 与int 比较,在32位机器,sizeof都是 占用4个字节: 在window 64位也是占用4个字节 但是在Linux 64位,long占用 8个字节, int占用4个字节,这样比较就会有 ...

  3. 《绝地求生大逃杀》BE错误怎么办 BE服务未正常运行及安装失败解决方法

    <绝地求生大逃杀>BattlEye Launcher是游戏的反作弊程序,也是启动过程中做容易出现错误的,今天小编带来“爆锤吧务”分享的<绝地求生大逃杀>BE服务未正常运行及安装 ...

  4. 汽车后市场:数据入口在哪里?不看你就OUT啦!

    当前中国汽车后服务市场基本可分七个大类:包括养护.维修.改装.二手车.汽车配件.相关电商及金融保险等,汽车后市场整个产业链对数据服务都有刚性需求. 数据能为行业服务提高效率,提升商家对于客户以及业务的 ...

  5. android自动化のadb常用命令(不定期更新)

    1. adb devices 执行结果是adb为每一个设备输出以下状态信息:序列号(serialNumber) — 由adb创建的使用控制台端口号的用于唯一标识一个模拟器或手机设备的字符串,格式是 & ...

  6. 孤荷凌寒自学python第八十天开始写Python的第一个爬虫10

    孤荷凌寒自学python第八十天开始写Python的第一个爬虫10 (完整学习过程屏幕记录视频地址在文末) 原计划今天应当可以解决读取所有页的目录并转而取出所有新闻的功能,不过由于学习时间不够,只是进 ...

  7. (原)HUD绘画贴图解析

    @小道:临时存放       1\主过程 说明: a\调用DrawTextureSimple时,会将UTexure封装成CavarsItem, 若是正交投射函数执行双,最后CavarsItem.Dra ...

  8. Hexo 博客 之 腾讯云部署过程

    写在前面 Hexo 博客搭好了有差不多两周时间了,这期间走了很多弯路,跳了很多坑.一些坑自己 bing 到了答案,找到了解决方法,一些坑则是自己摸索出来的解决方法.现在准备写几篇关于搭建流程.搭建过程 ...

  9. 【MySQL解惑笔记】Centos7下卸载彻底MySQL数据库

    彻底卸载Yum安装的MySQL数据库 在我第二章MySQL数据库基于Centos7.3-部署过程中,因为以前安装过其它的版本所以没有卸载干净影响后期安装 一.卸载Centos7自带的Maridb数据库 ...

  10. some Commands OF CONSOLE

    不可避免地使用console,一旦与电脑打交道:入口就是help,而很多行就直接过掉了,却不能看到需要的地方,在那里停下来,实际是需要使用more  less grep等 在windows中,使用di ...