题目大意:有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. 请输出in.txt文件中的2 4 6 8 9 10 12行

    in.txt文件: 学号 姓名 性别 年龄 1001 张三 男 18 1002 赵四 男 19 1003 李丽 女 18 1004 刘芳 女 32 1005 王五 男 54 1006 小明 男 32 ...

  2. ST表poj3264

      /* ST表多次查询区间最小值 设 g[j][i] 表示从第 i 个数到第 i + 2 ^ j - 1 个数之间的最小值 类似DP的说 ans[i][j]=min (ans[i][mid],ans ...

  3. VB编程技巧推荐

    VB编程技巧推荐   1.zyl910的专栏——理论水平高 用VB写高效的图像处理程序 V2.0 优化分支代码——避免跳转指令堵塞流水线 2.Laviewpbt的专栏 —— 有很多算法的代码,实用性高 ...

  4. (转)PHP数组的总结(很全面啊)

    一.什么是数组数组就是一组数据的集合,把一系列数据组织起来,形成一个可操作的整体.数组的每个实体都包含两项:键和值. 二.声明数据在PHP中声明数组的方式主要有两种:一是应用array()函数声明数组 ...

  5. javascript学习(知识点整理)

    有了这个代码,就可以在定义 中增加更多的控制了 后面会举例关于extjs定义的更多控制     此种方案可以解决定义时需要一些函数调用的情况 函数作用域和声明提前: 即由于js是解释性语言,在执行前会 ...

  6. COUNT()函数的使用

    COUNT函数 让我们能够数出在表格中有多少笔资料被选出来.它的语法是: SELECT COUNT("栏位名")        FROM "表格名" 举例来说, ...

  7. python3数据类型--数字

    数字 Python数字数据类型用于存储数值.数字数据类型是不允许改变的,所以如果改变数字数据类型的值,将重新分配内存空间. 以下实例在变量赋值时Number对象被创建: #!/usr/bin/env ...

  8. struts2中的路径问题

    <?xml version="1.0" encoding="GB18030" ?><%@ page language="java&q ...

  9. SpEL快速入门

    Spring表达式语言(简称SpEL)是一种鱼JSP2 EL功能类似的变道时语言,它可以在运行时查询和操作对象图.与JSP 2的EL相比,SpEL功能更加强大,它甚至支持方法的调用和基本字符串模板. ...

  10. how to count uv area

    先放着,空了再整理.... fn getModeUvVolumetric mode chang= ----得到UV使用率( --global facesNumSum = meshop.getnumfa ...