题目大意:有N个人,然后有F种食品和D种饮料,每个人都有喜欢的饮料和食品,求出来这些食品最多能满足多少人的需求。

输入描述:

分析:以前是做过类似的题目的,不过输入的信息量比较大,还是使用邻接表的好些,邻接矩阵有可能会TLE,建图如下图流程

不过要注意人需要拆点的,因为一个人只食用一种食品就可以了,所以拆点让他们之间的流量为1。ps:很伤心的这题竟然做了6个小时,算是比较裸的最大流题目....最后终于检查出来错误的位置,dinic里面把while循环写成了if,貌似这是第二次犯这么二缺的事儿了。
下面是AC代码。
==========================================================================================================
  1. #include<stdio.h>
  2. #include<algorithm>
  3. #include<queue>
  4. #include<string.h>
  5. using namespace std;
  6.  
  7. const int MAXN = ;
  8. const int oo = 1e9+;
  9.  
  10. struct Edge{int v, flow, next;}edge[MAXN*MAXN];
  11. int Head[MAXN], cnt;
  12. int layer[MAXN];///分层
  13.  
  14. void InIt()
  15. {
  16.     cnt = ;
  17.     memset(Head, -, sizeof(Head));
  18. }
  19. void AddEdge(int u, int v, int flow)
  20. {
  21.     edge[cnt].= v;
  22.     edge[cnt].flow = flow;
  23.     edge[cnt].next = Head[u];
  24.     Head[u] = cnt++;
  25. }
  26. bool bfs(int start, int End)
  27. {
  28.     queue<int> Q;Q.push(start);
  29.     memset(layer, , sizeof(layer));
  30.     layer[start] = ;
  31.  
  32.     while(Q.size())
  33.     {
  34.         int u = Q.front();Q.pop();
  35.  
  36.         if(== End)return true;
  37.  
  38.         for(int j=Head[u]; j!=-; j=edge[j].next)
  39.         {
  40.             int v = edge[j].v;
  41.  
  42.             if(layer[v] == false && edge[j].flow)
  43.             {
  44.                 layer[v] = layer[u] + ;
  45.                 Q.push(v);
  46.             }
  47.         }
  48.     }
  49.  
  50.     return false;
  51. }
  52. int dfs(int u, int MaxFlow, int End)
  53. {
  54.     if(== End)return MaxFlow;
  55.  
  56.     int uflow = ;
  57.  
  58.     for(int j=Head[u]; j!=-; j=edge[j].next)
  59.     {
  60.         int v = edge[j].v;
  61.  
  62.         if(layer[v]==layer[u]+ && edge[j].flow)
  63.         {
  64.             int flow = min(MaxFlow-uflow, edge[j].flow);
  65.             flow = dfs(v, flow, End);
  66.  
  67.             edge[j].flow -= flow;
  68.             edge[j^].flow += flow;
  69.             uflow += flow;
  70.  
  71.             if(uflow == MaxFlow)break;
  72.         }
  73.     }
  74.  
  75.     if(uflow == )
  76.         layer[u] = ;
  77.     return uflow;
  78. }
  79. int dinic(int start, int End)
  80. {
  81.     int MaxFlow = ;
  82.  
  83.     while(bfs(start, End) == true)
  84.         MaxFlow += dfs(start, oo, End);
  85.  
  86.     return MaxFlow;
  87. }
  88.  
  89. int main()
  90. {
  91.     int N, F, D;
  92.  
  93.     while(scanf("%d%d%d", &N, &F, &D) != EOF)
  94.     {///把人拆成两个中间流量是1
  95.         int Fi=N*, Di=Fi+F, start=Di+D+, End=start+;
  96.         int i, j, x; char s[MAXN]={};
  97.  
  98.         InIt();
  99.  
  100.         for(i=; i<=F; i++)
  101.         {///食物与源点相连
  102.             scanf("%d", &x);
  103.             AddEdge(start, Fi+i, x);
  104.             AddEdge(Fi+i, start, );
  105.         }
  106.  
  107.         for(i=; i<=D; i++)
  108.         {///饮料与汇点相连
  109.             scanf("%d", &x);
  110.             AddEdge(Di+i, End, x);
  111.             AddEdge(End, Di+i, );
  112.         }
  113.  
  114.         for(i=; i<=N; i++)
  115.         {///每个人对每种食物的喜欢或者不喜欢
  116.             scanf("%s", s+);
  117.             for(j=; s[j]; j++)
  118.             {
  119.                 if(s[j] == 'Y')
  120.                 {///建立食物和人的关系
  121.                     AddEdge(Fi+j, i, );
  122.                     AddEdge(i, Fi+j, );
  123.                 }
  124.             }
  125.  
  126.             ///人拆成两个点
  127.             AddEdge(i, N+i, );
  128.             AddEdge(N+i, i, );
  129.         }
  130.         for(i=; i<=N; i++)
  131.         {///个人对饮料的喜爱
  132.             scanf("%s", s+);
  133.             for(j=; s[j]; j++)
  134.             {///建立饮料和人(拆点)的关系
  135.                 if(s[j] == 'Y')
  136.                 {
  137.                     AddEdge(N+i, Di+j, );
  138.                     AddEdge(Di+j, N+i, );
  139.                 }
  140.             }
  141.         }
  142.  
  143.         printf("%d\n", dinic(start, End));
  144.     }
  145.  
  146.     return ;

}

H - Food - hdu 4292(简单最大流)的更多相关文章

  1. HDU 4292 Food 最大流

    Food Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  2. H - Food HDU - 4292 网络流

    题目   You, a part-time dining service worker in your college’s dining hall, are now confused with a n ...

  3. HDU 4292 Food (网络流,最大流)

    HDU 4292 Food (网络流,最大流) Description You, a part-time dining service worker in your college's dining ...

  4. FFmpeg的H.264解码器源代码简单分析:环路滤波(Loop Filter)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  5. FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧间宏块(Inter)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  6. FFmpeg的H.264解码器源代码简单分析:熵解码(Entropy Decoding)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  7. FFmpeg的H.264解码器源代码简单分析:解码器主干部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  8. FFmpeg的H.264解码器源代码简单分析:解析器(Parser)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  9. FFmpeg的H.264解码器源代码简单分析:概述

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

随机推荐

  1. 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格式不一致的解决办法

    -----转载:http://blog.csdn.net/sgear/article/details/7663502 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格 ...

  2. IIS 配置问题解决

    无法识别的属性“targetFramework”.请注意属性名称区分大小写. 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错 ...

  3. GitHub-修改以下host-ip可加快访问速度

    #GitHub START 207.97.227.239    github.com 204.232.175.94    gist.github.com 107.21.116.220    help. ...

  4. Linux makefile 教程 非常详细,且易懂(转)

    转自:http://blog.chinaunix.net/uid-27717694-id-3696246.html 原文地址:Linux makefile 教程 非常详细,且易懂 作者:Deem_pa ...

  5. 10_RHEL安装搜狗输入法

    首先需要安装相关源 1.加入EPEL源 EPEL7几乎是必备的源: $ sudo yum install epel-release 2.添加mosquito-myrepo源 mosquito-myre ...

  6. javascript 键值对

    <script type="text/javascript"> var arr = new Array(); arr['cn'] = '中国'; arr['usa'] ...

  7. HTML5拖放

    HTML5拖放 <!doctype html> <html> <head> <meta charset="UTF-8"> <t ...

  8. mysql的sql优化案例

    前言 mysql的sql优化器比较弱,选择执行计划貌似很随机. 案例 一.表结构说明mysql> show create table table_order\G***************** ...

  9. jdom学习:读取xml文件

    用JDOM读取XML文件需先用org.jdom.input.SAXBuilder对象的build()方法创建Document对象,然后用Document类.Element类等的方法读取所需的内容.IB ...

  10. Can't connect to local MySQL server through socket

    今天上午在测试代码的时候发现在执行写mysql的时候总是超时,然后失败,使用mysql命令 show processlist; 发现有两条update的sql语句已经执行了很长时间,以为是这两个程序把 ...