题目大意:有一群牛,还有一些牛喜欢的食物和喜欢的饮料,不过这些牛都很特别,他们不会与别的牛吃同一种食物或者饮料,现在约翰拿了一些食物和饮料,同时他也知道这些牛喜欢的食物和饮料的种类,求出来最多能让多少头牛吃上食物还并且喝饮料。

输入分析:输入的第一行是N F D,分别是牛,食物,饮料的个数。下面N行,每行开始的前两个数分别是Fi,Di表示第i头牛喜欢的食物和饮料的个数,紧跟着输入Fi种食物和Di种饮料。


分析:看到这里很容易就可以想到用牛与食物建立关系,并且让牛同时与饮料建立关系(把牛放在中间,仔细想一下为什么)。不过这样很明显也会出现问题,比如下面(图1),因为只能满足一头牛,所以为了不出现这种错误,我们需要把牛拆开,中间再加一条边让他们的最大承受流量是1(图2),这样不管有多少与它相连他中间只能经过流量 1,再添加一个源点和汇点。这样就可以用最大流解决了。

(图1)

 (图2)

ps:写dinic给残余网络分层的时候用了if,然后调试了很久很久。。。。发现后心中有十万头草泥马狂奔而过,还是要细心才是
**************************************************************************************************************************************************
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std; const int MAXN = ;
const int oo = 1e9+; int G[MAXN][MAXN], layer[MAXN]; bool bfs(int start, int End)
{
    bool used[MAXN]={};
    queue<int> Q;Q.push(start);
    memset(layer, -, sizeof(layer));
    layer[start] = , used[start] = true;     while(Q.size())
    {
        int u = Q.front();Q.pop();         if(u == End)return true;         for(int i=; i<=End; i++)
        {
            if(G[u][i] && used[i] == false)
            {
                used[i] = true;
                layer[i] = layer[u]+;
                Q.push(i);
            }
        }
    }     return false;
}
int dfs(int u, int MaxFlow, int End)
{
    if(u == End)return MaxFlow;     int uFlow = ;     for(int i=; i<=End; i++)
    {
        if(G[u][i] && layer[i]==layer[u]+)
        {
            int flow = min(MaxFlow-uFlow, G[u][i]);
            flow = dfs(i, flow, End);             G[u][i] -= flow;
            G[i][u] += flow;
            uFlow += flow;             if(uFlow == MaxFlow)
                break;
        }
    }     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)
    {///拆点后牛开始位置,源点和汇点
        int Ni = N+F+D, start = Ni+N+, End = start+;         int i, j, x, Di, Fi;         memset(G, , sizeof(G));         for(i=; i<=N; i++)
        {///食物放在前面,牛放在中间,饮料放在最后面             scanf("%d%d", &Fi, &Di);
            for(j=; j<=Fi; j++)
            {///这头牛喜欢的食物,牛的区间在F~N+F
                scanf("%d", &x);
                G[x][F+i] = true;///用食物连接牛
            }
            for(j=; j<=Di; j++)
            {///这头牛喜欢的饮料,饮料的区间在 F+N~F+N+D
                scanf("%d", &x);
                G[Ni+i][F+N+x] = true;///用拆的点连接
            }
        }         for(i=; i<=N; i++)///建立牛和拆点的关系
            G[F+i][Ni+i] = true;
        for(i=; i<=F; i++)///建立源点和食物的关系
            G[start][i] = true;
        for(i=; i<=D; i++)///建立饮料喝汇点的关系
            G[F+N+i][End] = true;         printf("%d\n", dinic(start, End));
    }     return ;
}
/* 2 2 2
2 2 1 2 1 2
2 1 1 2 1
*/  

B - Dining - poj 3281(最大流)的更多相关文章

  1. poj 3281 最大流+建图

    很巧妙的思想 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/21/2649850.html 本题能够想到用最大流做,那真的是太绝了.建模的方法很 ...

  2. poj 3281 最大流建图

    题目链接:http://poj.org/problem?id=3281 #include <cstdio> #include <cmath> #include <algo ...

  3. POJ 3281 最大流

    Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17251   Accepted: 7643 Descripti ...

  4. [poj 3281]最大流+建图很巧妙

    题目链接:http://poj.org/problem?id=3281 看了kuangbin大佬的思路,还用着kuangbin板子orz   http://www.cnblogs.com/kuangb ...

  5. Dining POJ - 3281

    题意: f个食物,d杯饮料,每个牛都有想吃的食物和想喝的饮料,但食物和饮料每个只有一份 求最多能满足多少头牛.... 解析: 一道简单的无源汇拆点最大流   无源汇的一个最大流,先建立超级源s和超级汇 ...

  6. AC日记——Dining poj 3281

    [POJ-3281] 思路: 把牛拆点: s向食物连边,流量1: 饮料向t连边,流量1: 食物向牛1连边,流量1: 牛2向饮料连边,流量1: 最大流: 来,上代码: #include <cstd ...

  7. kuangbin专题专题十一 网络流 Dining POJ - 3281

    题目链接:https://vjudge.net/problem/POJ-3281 题目:有不同种类的食物和饮料,每种只有1个库存,有N头牛,每头牛喜欢某些食物和某些饮料,但是一头牛 只能吃一种食物和喝 ...

  8. B - Dining POJ - 3281 网络流

    Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will c ...

  9. poj 3281 Dining 网络流-最大流-建图的题

    题意很简单:JOHN是一个农场主养了一些奶牛,神奇的是这些个奶牛有不同的品味,只喜欢吃某些食物,喝某些饮料,傻傻的John做了很多食物和饮料,但她不知道可以最多喂饱多少牛,(喂饱当然是有吃有喝才会饱) ...

随机推荐

  1. yii columns value and type and checkbox columns

    value  I am here type  I am here checkbox columns   useage

  2. 关于Linux的缓存内存 Cache Memory详解<转>

    转自 http://www.ha97.com/4337.html PS:前天有童鞋问我,为啥我的Linux系统没运行多少程序,显示的可用内存这么少?其实Linux与Win的内存管理不同,会尽量缓存内存 ...

  3. python-property、docstring--笔记

    已经有人总结的非常详细,而且写得不错,就直接贴过来用了 property作为装饰器函数,负责把一个方法变成属性调用的 廖雪峰关于property的讲解 http://www.liaoxuefeng.c ...

  4. webpack 配置 (支持 React SCSS ES6 编译打包 和 模块热更新 / 生成SourceMap)

    1.首先是目录结构 |-node_modules/ #包文件 |-build/ #静态资源生成目录 |-src/ #开发目录 |-js/ |-index.js #入口文件 |-app.js #Reac ...

  5. response.setContentType()的作用及参数

    package com.java1234.util; import java.io.PrintWriter; import javax.servlet.http.HttpServletResponse ...

  6. servlet+jdbc+javabean其实跟ssh差不多

    我给的这个架构可以代替ssh的架构进行项目的开发 common中放的是一些公用类 dao中放的是一些对数据的处理 entity其实也就是javabean service中放的是一些抽象类,简单来说抽象 ...

  7. HTML5 Canvas Text文本居中实例

    1.代码: <canvas width="700" height="300" id="canvasOne" class="c ...

  8. AutoLayout(转)

    转自    http://blog.sina.com.cn/s/blog_9564cb6e0101wv9o.html controller和View的责任分配: 1.View指定固有的content  ...

  9. iOS开发实现登陆

    Assumption假设:iOS端加载Web页,然后用户输入用户名密码登陆,WebServer会把用户登陆信息记载在Cookie.那么iOS客户端如何取到Cookie中的登陆信息. 客户端监听 NSH ...

  10. C++拾遗(三)关于复合类型

    数组相关 初始化只能在定义的时候使用,不能把数组赋给另一个数组. 初始化可以提供比元素数目少的初值,其它元素将被置为0. 字符char数组只有在以\0结尾时才是一个字符串.sizeof()返回数组的长 ...