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

输入描述:

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

不过要注意人需要拆点的,因为一个人只食用一种食品就可以了,所以拆点让他们之间的流量为1。ps:很伤心的这题竟然做了6个小时,算是比较裸的最大流题目....最后终于检查出来错误的位置,dinic里面把while循环写成了if,貌似这是第二次犯这么二缺的事儿了。
下面是AC代码。
==========================================================================================================
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<string.h>
using namespace std; const int MAXN = ;
const int oo = 1e9+; struct Edge{int v, flow, next;}edge[MAXN*MAXN];
int Head[MAXN], cnt;
int layer[MAXN];///分层 void InIt()
{
    cnt = ;
    memset(Head, -, sizeof(Head));
}
void AddEdge(int u, int v, int flow)
{
    edge[cnt].v = v;
    edge[cnt].flow = flow;
    edge[cnt].next = Head[u];
    Head[u] = cnt++;
}
bool bfs(int start, int End)
{
    queue<int> Q;Q.push(start);
    memset(layer, , sizeof(layer));
    layer[start] = ;     while(Q.size())
    {
        int u = Q.front();Q.pop();         if(u == End)return true;         for(int j=Head[u]; j!=-; j=edge[j].next)
        {
            int v = edge[j].v;             if(layer[v] == false && edge[j].flow)
            {
                layer[v] = layer[u] + ;
                Q.push(v);
            }
        }
    }     return false;
}
int dfs(int u, int MaxFlow, int End)
{
    if(u == End)return MaxFlow;     int uflow = ;     for(int j=Head[u]; j!=-; j=edge[j].next)
    {
        int v = edge[j].v;         if(layer[v]==layer[u]+ && edge[j].flow)
        {
            int flow = min(MaxFlow-uflow, edge[j].flow);
            flow = dfs(v, flow, End);             edge[j].flow -= flow;
            edge[j^].flow += flow;
            uflow += flow;             if(uflow == MaxFlow)break;
        }
    }     if(uflow == )
        layer[u] = ;
    return uflow;
}
int dinic(int start, int End)
{
    int MaxFlow = ;     while(bfs(start, End) == true)
        MaxFlow += dfs(start, oo, End);     return MaxFlow;
} int main()
{
    int N, F, D;     while(scanf("%d%d%d", &N, &F, &D) != EOF)
    {///把人拆成两个中间流量是1
        int Fi=N*, Di=Fi+F, start=Di+D+, End=start+;
        int i, j, x; char s[MAXN]={};         InIt();         for(i=; i<=F; i++)
        {///食物与源点相连
            scanf("%d", &x);
            AddEdge(start, Fi+i, x);
            AddEdge(Fi+i, start, );
        }         for(i=; i<=D; i++)
        {///饮料与汇点相连
            scanf("%d", &x);
            AddEdge(Di+i, End, x);
            AddEdge(End, Di+i, );
        }         for(i=; i<=N; i++)
        {///每个人对每种食物的喜欢或者不喜欢
            scanf("%s", s+);
            for(j=; s[j]; j++)
            {
                if(s[j] == 'Y')
                {///建立食物和人的关系
                    AddEdge(Fi+j, i, );
                    AddEdge(i, Fi+j, );
                }
            }             ///人拆成两个点
            AddEdge(i, N+i, );
            AddEdge(N+i, i, );
        }
        for(i=; i<=N; i++)
        {///个人对饮料的喜爱
            scanf("%s", s+);
            for(j=; s[j]; j++)
            {///建立饮料和人(拆点)的关系
                if(s[j] == 'Y')
                {
                    AddEdge(N+i, Di+j, );
                    AddEdge(Di+j, N+i, );
                }
            }
        }         printf("%d\n", dinic(start, End));
    }     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. centos 安装 lnmp

    直接yum install nginx不行,要先处理下源,下面是安装完整流程 1. rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/ng ...

  2. ASP.net中网站访问量统计方法

    仅共学习 一.建立一个数据表IPStat用于存放用户信息 我在IPStat表中存放的用户信息只包括登录用户的IP(IP_Address),IP来源(IP_Src)和登录时间 (IP_DateTime) ...

  3. (转)ecshop 后台商品分类添加图片的功能

    转之--http://blog.sina.com.cn/s/blog_4696b3760100n5ee.html   1 .首先找到数据表 ecs_category (商品分类表) 添加一 cat_i ...

  4. cocopods安装

    CocoaPods安装和使用教程 Code4App 原创文章.转载请注明出处:http://code4app.com/article/cocoapods-install-usage 目录 CocoaP ...

  5. Scene is unreachable due to lack of entry points and does not have an identifier for runtime access

    使用Storyboard时出现以下警告: warning: Unsupported Configuration: Scene is unreachable due to lack of entry p ...

  6. WebService CXF调试常见报错及解决方案

    1.CXF java.lang.RuntimeException: Cannot create a secure XMLInputFactory 解决方案:从apache-cxf/lib下寻找Wood ...

  7. 8.模板方法模式-[Head First 设计模式]

    模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 要点: “模板方法”定义了算法的步骤,把这些步骤的实现延 ...

  8. [转]C++基本功和 Design Pattern系列 ctor & dtor

    今天Aear讲的是class.ctor 也就是constructor, 和  class.dtor, destructor. 相信大家都知道constructor 和 destructor是做什么用的 ...

  9. TCP/IP-入门

    Life is not a rehearsal "人生没有彩排" 参考资料:TCP/IP入门经典 (第五版) TCP/IP详解 卷一:协议 一.什么是TCP/IP TCP/IP是一 ...

  10. JavaScript-学习一

    JavaScript 对大小写是敏感的. 当编写 JavaScript 语句时,请留意是否关闭大小写切换键. 函数 getElementById 与 getElementbyID 是不同的. 同样,变 ...