题目链接:https://vjudge.net/problem/POJ-3281

题目:有不同种类的食物和饮料,每种只有1个库存,有N头牛,每头牛喜欢某些食物和某些饮料,但是一头牛

只能吃一种食物和喝一种饮料,问怎么分配食物和饮料才能让最多数量的牛饱餐。

思路:容易想到  食物->牛->饮料的流,当然一个牛可以被多个饮料流到,需要把牛拆成入点和出点,入点和出点流量为1,这样可以保证牛只吃或者喝某种食物和饮料,别的都流是套路,除了牛的分点之间流量为1,别的连接设置成1或者INF都一样,因为有牛的分点流量的限制。

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std; const int N = ,INF = (int)1e9;
int n,F,D,tot,S,T;
int head[N],lev[N];
queue<int > que;
struct node{
int to,nxt,flow;
}e[N*N]; inline void add(int u,int v,int flow){
e[tot].to = v;
e[tot].flow = flow;
e[tot].nxt = head[u];
head[u] = tot++;
e[tot].to = u;
e[tot].flow = ;
e[tot].nxt = head[v];
head[v] = tot++;
} void build_map(int s,int t){ for(int i = s; i <= t; ++i) head[i] = -; tot = ;
//读入信息 0是源点 1~F食物 F+1~F+2*n牛 F+2*n+1~F+2*n+D饮料 F+2*n+D+1是汇点
int kind_f,kind_d,x;
for(int i = ; i <= n; ++i){
scanf("%d%d",&kind_f,&kind_d);
for(int j = ; j <= kind_f; ++j){
scanf("%d",&x);
add(x,F+i,);// add(F+i,x,0);
}
for(int j = ; j <= kind_d; ++j){
scanf("%d",&x);
add(F+n+i,F+*n+x,);// add(F+2*n+x,F+n+i,0);
}
}
for(int i = ; i <= F; ++i){
add(s,i,);// add(i,s,0);
}
for(int i = ; i <= D; ++i){
add(F+*n+i,t,);// add(t,F+2*n+i,0);
}
for(int i = ; i <= n; ++i){
add(F+i,F+n+i,);// add(F+n+i,F+i,0);
}
} void show(int s,int t){
for(int i = s; i <= t; ++i){
cout << "当前点为 " << i << " ";
cout << "能去到 ";
for(int o = head[i]; ~o; o = e[o].nxt){
printf(" %d 流量为 %d",e[o].to,e[o].flow);
}cout << endl;
}
} bool bfs(int s,int t){
while(!que.empty()) que.pop();
for(int i = s; i <= t; ++i) lev[i] = ;
lev[s] = ;
que.push(s);
while(!que.empty()){
int u = que.front(); que.pop();
for(int o = head[u]; ~o; o = e[o].nxt){
int v = e[o].to;
if(!lev[v] && e[o].flow ){
lev[v] = lev[u] + ;
if(v == t) return true;
que.push(v);
}
}
}
return false;
} int dfs(int now,int flow,int t){
if(now == t) return flow;
int to,sum = ,tmp;
for(int o = head[now]; ~o; o = e[o].nxt){
to = e[o].to;
if((lev[to] == lev[now] + ) && e[o].flow && (tmp = dfs(to,min(flow-sum,e[o].flow),t))){
e[o].flow -= tmp;
e[o^].flow += tmp;
if((sum += tmp) == flow) return sum;
}
}
return sum;
} int mf(int s,int t){
int _mf = ;
while(bfs(s,t)){
_mf += dfs(s,INF,t);
}
return _mf;
} int main(){ scanf("%d%d%d",&n,&F,&D);
S = ; T = F+*n+D+;
//建图
build_map(S,T);
// show(S,T); //图的显示
int ans = mf(S,T);
printf("%d\n",ans); return ;
}

kuangbin专题专题十一 网络流 Dining POJ - 3281的更多相关文章

  1. B - Dining POJ - 3281 网络流

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

  2. B - Dining - poj 3281(最大流)

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

  3. Dining POJ - 3281

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

  4. AC日记——Dining poj 3281

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

  5. [kuangbin带你飞]专题十一 网络流

            ID Origin Title   34 / 81 Problem A POJ 3436 ACM Computer Factory   92 / 195 Problem B POJ 3 ...

  6. Kuangbin 带你飞专题十一 网络流题解 及模版 及上下界网络流等问题

    首先是几份模版 最大流:虽然EK很慢但是优势就是短.求最小割的时候可以根据增广时的a数组来判断哪些边是割边.然而SAP的最大流版我只会套版,并不知道该如何找到这个割边.在尝试的时候发现了一些问题.所以 ...

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

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

  8. POJ 3281 Dining (网络流)

    POJ 3281 Dining (网络流) Description Cows are such finicky eaters. Each cow has a preference for certai ...

  9. POJ 3281 网络流dinic算法

    B - Dining Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit S ...

随机推荐

  1. ajaxSetup()方法

    使用ajaxSetup()方法设置全局Ajax默认选项 使用ajaxSetup()方法可以设置Ajax请求的一些全局性选项值,设置完成后,后面的Ajax请求将不需要再添加这些选项值,它的调用格式为: ...

  2. Linux 内核 MCA 总线

    微通道体系(MCA)是一个 IBM 标准, 用在 PS/2 计算机和一些笔记本电脑. 在硬件级别, 微通道比 ISA 有更多特性. 它支持多主 DMA, 32-位地址和数据线, 共享中断线, 和地理 ...

  3. ZR提高失恋测4

    ZR提高失恋测4 比赛链接 A (方便讨论,设读入的串为\(S,T\)答案串为\(A\)) 首先\(*\)只会有一个 这是这道题目中非常重要的一个结论 简单证明一下? 因为\(*\)可以代表所有的字符 ...

  4. P3521 [POI2011]ROT-Tree Rotations (线段树合并)

    P3521 [POI2011]ROT-Tree Rotations 题意: 给你一颗树,只有叶子节点有权值,你可以交换一个点的左右子树,问你最小的逆序对数 题解: 线段树维护权值个个数即可 然后左右子 ...

  5. github 项目搜索技巧-让你更高效精准地搜索项目

    目录 github 搜索技巧 案例 普通搜 搭配技巧搜 限定词 查找某个用户或组织的项目 辅助限定词 还没搞懂的(关于 forks.mirror.issues) 排序(放的是官网的链接) 使用指南 练 ...

  6. 专业版12.0试用,打开演示账套,提示&ldquo;列名FPlatver无效&rdquo;

    你好,我代表研发来说明一下这个问题:一.产生的原因:由于KIS产品今年陆续都增加了应用平台,前期平台兼容性还有些问题,如果一台电脑有多个不同版本的平台,就会产生冲突,因此报错.1.可能您的机器装了多个 ...

  7. codefoce 782c

    好久没有更新了,特地来水一水 简单的涂色问题,大佬说基本都是贪心 #include<cstdio> #include<iostream> #include<vector& ...

  8. 别怕,"卷积"其实很简单(上)

    文章来自我的CSDN同名博客,欢迎文末扫码关注~   前言 相信很多时候,当我们在看到“卷积”时,总是处于一脸懵逼的状态,不但因为它的本身概念比较难理解,还因为它在不同的应用中发挥出的变幻莫测的作用也 ...

  9. 动态规划,以LeetCode-CombinationSumIV问题为例

    简介: 动态规划问题面试中经常遇到的问题之一,按照动态规划的一般定义,其一般解法在于将大问题分解为很多小问题去解决,但是我在遇到很多实际的问题时,想法都是强行的去将问题分解,而忽略了分解的必要性和途径 ...

  10. ASCII、UNICODE、UTF

    在计算机中,一个字节对应8位,每位可以用0或1表示,因此一个字节可以表示256种情况. ascii 美国人用了一个字节中的后7位来表达他们常用的字符,最高位一直是0,这便是ascii码. 因此asci ...