吃饭【网络流】

P2891 P1402 P1231 【模板】三分图匹配 题解 这三题简直一模一样: P1402 酒店之王 P1231 教辅的组成 P2891 [USACO07OPEN]吃饭Dining 网络流-最大流-最大匹配 感觉就是三分图匹配(雾 注意,三分图中间的那一层需要拆点,不然一个点可能被访问多次 代码: P2891 [USACO07OPEN]吃饭Dining #include<cstdio> #include<iostream> #in... 阅读详情

题目大意:

有nn头牛,每头牛有自己喜欢的食物和饮料,每种食物或饮料只有一个。求最多能让多少头牛吃到食物并喝到饮料。
Input

4 3 3
2 2 1 2 3 1
2 2 2 3 1 2
2 2 1 3 1 2
2 1 1 3 3

OutputOutput

3

思路:

很明显的最大流题目。这道题匈牙利会超时,正解是DinicDinic。
这道题最难的也就是考点是建图。很容易想到这样的建法(权值均为1):
这里写图片描述
但是这样的话,就有可能一头牛吃多个食物及饮料,例如上图中牛11可以既吃食物1,饮料22组成的套餐,又可以吃食物2,饮料dd组成的套餐。
所以,这里就要拆点。将一头牛拆成两头,中间连一条权值为1的线,就可以保证不会有一头牛吃多组套餐的情况。
这里写图片描述


代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#define Inf 0x7f
#define INF 2147483647
using namespace std;

int n,f,d,s,t,ans,sum,num,fnum,dnum,x,k,head[5000001],dep[5000001];

struct edge
{
    int c,to,next;
}e[5000001];

void add(int from,int to,int c)
{
    k++;
    e[k].to=to;
    e[k].c=c;
    e[k].next=head[from];
    head[from]=k;
}

bool bfs()  //分层
{
    memset(dep,Inf,sizeof(dep));
    queue<int> q;
    q.push(s);
    dep[s]=0;
    while (q.size())
    {
        int u=q.front();
        q.pop();
        for (int i=head[u];i;i=e[i].next)
        {
            int v=e[i].to;
            if (dep[v]>dep[u]+1&&e[i].c)
            {
                dep[v]=dep[u]+1;
                q.push(v);
            }
        }
    }
    return (dep[t]<Inf);
}

int dfs(int u,int low)
{
    int lows=0;
    if (u==t) return low;
    for (int i=head[u];i;i=e[i].next)
    {
        int v=e[i].to;
        if (dep[v]==dep[u]+1&&e[i].c) 
        {
            lows=dfs(v,min(low,e[i].c));  //继续找增广路
            if (!lows) continue;
            e[i].c-=lows;  //正向边
            e[(i+1)^1-1].c+=lows;  //反向边
            return lows;
        }
    }
    return 0;
}

int main()
{
    //建图时牛a编号为1~n,牛b编号为n+1~2n,食物编号为2n+1~2n+f,饮料编号为2n+f+1~2n+f+d
    scanf("%d%d%d",&n,&f,&d);
    s=0;
    t=n+n+f+d+1;
    for (int i=1;i<=n;i++)
    {
        scanf("%d%d",&fnum,&dnum);
        for (int j=1;j<=fnum;j++)  //食物连向牛a
        {
            scanf("%d",&x);
            add(n+n+x,i,1);
            add(i,n+n+x,0);
        }
        for (int j=1;j<=dnum;j++)  //牛b连向饮料
        {
            scanf("%d",&x);
            add(n+i,n+n+f+x,1);
            add(n+n+f+x,n+i,0);
        }
    }
    for (int i=1;i<=n;i++)  //牛a连向牛b
    {
        add(i,n+i,1);
        add(n+i,i,0);
    }
    for (int i=1;i<=f;i++)  //S连向食物
    {
        add(s,n+n+i,1);
        add(n+n+i,s,0);
    }
    for (int i=1;i<=d;i++)  //饮料连向T
    {
        add(n+n+f+i,t,1);
        add(t,n+n+f+i,0);
    }
    while (bfs())
    {
        while (sum=dfs(s,INF))
         ans+=sum;  
    }
    printf("%d\n",ans);
    return 0;
}
nRF5340双核实战:从Zephyr环境搭建到蓝牙协议栈部署 本文详细介绍了nRF5340双核处理器的开发实践,包括Zephyr环境搭建、蓝牙协议栈部署及双核协同工作配置。通过实战案例展示了如何利用nRF5340的双核异构架构提升蓝牙应用性能,并提供了调试技巧与资源优化建议,帮助开发者高效实现低功耗蓝牙设备开发。 阅读详情

相关推荐

LSF0108 level shift设计使用及debug流程

目录 初版设计 测试出现的问题1 解决问题(尝试1) 测试出现的问题2 解决问题2-1 解决问题2-2 单Port测试结果 所有Port均连接测试结果 初版设计 此电路的应用场景在于将LCD屏幕连接到FPGA上,进而通过FPGA中设计的硬件电路来驱动LCD屏幕,验证数字硬件电路设计的正确性。因此需要一个转接板位于FPGA和LCD屏幕之间,将二者连接起来。 转接板的硬件电路设计主要存在以下需求: 实现3.3V和1.8V之间的同时双向逻辑转换(LCD屏幕电平为3.3V,FPGA电平为1.

moshanghongfeng的博客 7562

一些网络流。

POJ 3281  题意:每一头牛都有它喜欢吃的食物和饮料,问最多能满足多少头牛 让它吃到它喜欢吃的食物和饮料。   思路:从源点S对每一个食物连一条边,容量为1, 然后食物对喜欢吃这种食物的牛连边,容量也为1,然后每头牛连一条边到喜欢吃的饮料 容量也为1。      每个饮料连边到汇点,容量为1。  这样图构好了,但是每头牛可能会产生吃多个食物或者多个饮料的情况,所以对牛这个点也要

u012896700的专栏 846

全桥LLC谐振变换器变频控制工作原理与仿真

全桥LLC谐振变换器以其效率高、全范围软开关、器件电应力小等优点,越来越多地应用于大功率场合。电力电子技术的发展日益追求高频化,所带来的问题是半导体开关器件高频运行时的开关损耗急剧增加。各种软开关电路随之出现。可以有效减小开关损耗,使进一步提高开关频率成为可能。谐振式开关因其可在电流自然过零点开通半导体器件,实现零电压开关,特别适合采用MOSFET作开关的装置。最简单的谐振电路有串联谐振(SRC)和并联谐振(PRC)。SRC只能工作于降压状态,应用受限;

晞子的技术札记 3075

洛谷 P2891 [USACO07OPEN]吃饭Dining 网络流 最大流 Dinic算法

题目链接: https://www.luogu.com.cn/problem/P2891 本题和 洛谷 P1402 酒店之王https://www.luogu.com.cn/problem/P1402 和 洛谷 P1231 教辅的组成https://www.luogu.com.cn/problem/P1231 思路完全一致见https://blog.youkuaiyun.com/aiwo...

aiwo1376301646的博客 320

反序列化漏洞详解

目录 一、什么是序列化和反序列化 二、什么是反序列化漏洞 三、序列化函数(serialize) 四、反序列化(unserialize) ​五、什么是PHP魔术方法 六、一些常见的魔术方法 七、魔术方法的利用 八、反序列化漏洞的利用 1.__destruct()函数 2.__wakeup() 3.toString() ​九、反序列化漏洞的防御 一、什么是序列化和反序列化 序列化是将对象转换为字符串以便存储传输的一种方式。而反序列化恰好就是序列化的逆过程,反序列化会将字符串.

LJH1999ZN的博客 3万+

大华/华睿工业相机(摄像头)链接电脑,并用OpenCV打开

睿科是大华旗下机器视觉子公司,现在工业相机一般是华睿在产,要下载驱动程序,要到华睿官网哪里下载。由于我的电脑没有摄像头,所以摄像头序列化为0,电脑的第一个摄像头默认为0,序列号是0,1,2,3……,你是什么接口连接的就选择什么, 建议直接全选。我这里选择第二个,下载后点击安装,的你要点击识别右侧设置,设置。这个过程很简单,故不赘述。打开你的设备会在右边显示。

qq_48050838的博客 1万+

「网络流 24 题」圆桌聚餐

所有餐桌连源点容量为餐桌容量,所有单位连汇点容量为单位人数,题目要求同一单位不能再同一餐桌就餐,那么对于每个餐桌,与所有单位建边且容量为1即可,最后求一遍最大流。 #include #include #include #include #include using namespace std; const int INF = 1e9 + 7; const int maxm = 1005; con

~不可描述~ 406

保姆级教程:2026版Windows电脑换新,微信QQ聊天记录无损搬家(附路径修改避坑指南)

本文提供2026版Windows电脑换新时微信QQ聊天记录无损迁移的保姆级教程,涵盖最新版微信/QQ的存储路径修改和避坑指南。通过详细步骤和实战技巧,确保数据迁移过程中不丢失任何珍贵对话记录和文件,特别适合需要保留完整聊天记录的用户。

weixin_42629815的博客 2483

BZOJ 1711 Dining 吃饭 网络流

网络流重在建图。其中每一头牛对应一种饮料与食物。将饮料与食物放在两边,牛放在中间,对应连接边,cap(容量)设为1。其中要注意,一头牛只能对应一种饮料与一种食物,可能有多种食物指向一头牛,所以要把牛的结点分裂成两个,用边连接,cap为1。节点分配弄清楚。(邻接表加边一定要写函数不然代码辣目0。0)#include <cstdio> #include <cstring> #define INF 105

YihAN_Z 361

SAP-ABAP:SAP创建CDS视图(SQL语句创建)实例详解

通过Eclipse和ADT创建CDS视图是SAP开发中的一项重要技能。CDS视图不仅简化了数据建模,还提供了高性能和灵活性。掌握CDS视图的开发和使用,可以帮助你更好地支持SAP S/4HANA和Fiori应用的开发。

baidu_35680696的博客 1825

高项备考论文:规划绩效域

高项备考论文:规划绩效域

liuxu324的博客 1128

网络流 模板【Usaco2007 Open】bzoj1711 Dining吃饭

网络流 网络流通常有一个源点,一个汇点,和其他若干点,这些点之间有若干条有向边,每条边上有一个负载上限,称为容量。题目通常要求我们求出在所有边容量允许的范围内,从源点到汇点流量的最大值。 一般情况下,网络流都不会很难写,网络流题目大多数都难在建图上。dinic算法: step1: bfs给所有有可行流的点标号,建立层次网络,源点标为1,将所有能标的点标完或标到汇点结束; step2: 如

Todobe 526

【软考之软件设计师】学习笔记

interface 接口implements 实现接口(与接口配套使用)接口里要是有方法定义,子类就会实现。

云轩阁 2533

[网络流] 洛谷P2891 [USACO07OPEN]吃饭Dining

洛谷P2891 [USACO07OPEN]吃饭Dining: https://www.luogu.org/problemnew/show/P2891 n头牛f个食物d个饮料 求有多少头牛同时能享受到食物和饮料 (其实我第一反应是二分图匹配 [而且题目又是牛!不就是公牛配母牛吗!]) 好吧它既要满足有肉吃还要满足有水喝(比机房日子好多了学校的饭真的不好吃quq) 网络流? 好吧这只是一个

kkkGIGi_qtt 236

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

bzoj 1711: [Usaco2007 Open]Dining吃饭 网络流

一个烂大街的题 题解泛滥 我来蹭点访问量+扩充博客文章 由于我懒得算需要开多大数组 就直接开大点然后就不管了... 代码: #include #include #include #include #include #define ll long long #define inf 10000001 using namespace std; struct nod

everlasting的博客 316

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【bzoj1711/Usaco2007 Open】Dining吃饭——网络流

Description 农夫JOHN为牛们做了很好的食品,但是牛吃饭很挑食. 每一头牛只喜欢吃一些食品和饮料而别的一概不吃.虽然他不一定能把所有牛喂饱,他还是想让尽可能多的牛吃到他们喜欢的食品和饮料. 农夫JOHN做了F (1 <= F <= 100) 种食品并准备了D (1 <= D <= 100) 种饮料. 他的N (1 <= N <= 10...

weixin_30675247的博客 118

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

bzoj1711: [Usaco2007 Open]Dining吃饭(网络流)

题目传送门 真是吃屎了漏了一个细节。解法: 想了一会儿怎么表示一头牛又吃了饮料又喝了食物呢。 很简单。牛放在中间不就完了。 左边食物右边饮料,流量都为1。 食物连向牛,牛连向饮料,这样就能表示啦。 哈哈又切一题。开心的码代码。 错了! 想了半天发现一头牛可能吃了两份东西。。那样的话流量就会为2了。。 流量为2肯定有两个食物各给了流量。 那么我们就需要限制每头牛只吃一个食物,所以每

Hanks_o的博客 459

Gym 101190D,上下界区间覆盖

Delight for a Cat A cat is going on an adventure. Each hour, the cat can be either sleeping or eating. The cat cannot be doing both actions at the same hour, and the cat is doing exactly one of these ...

xing_mo的博客 247

HDU - 5988 2016 QingDao ICPC G (费用流)

题目:https://vjudge.net/problem/HDU-5988 题意:一个网络流的图,有n个点,从1~n,然后m条边,每个点有两个值,一个是人的数量一个是饭的数量。每条边有容量,还有走上去可能踩断电线的几率。问让所有人吃到饭的前提下断电线的最小概率是多少。  分析:使用log把乘法变加法,先建容量为1,费用为0的边,之后建正常的边,以0,n+1为源点和汇点跑费用流即可 代码: ...

Insist_77的博客 268

【HDU5988】Coding Contest 费用流

传送⻔ 题意 给定n个点,m条有向边,每个点是一个吃饭的地方,每个人一盒饭。每个点有S个人,有B盒饭。每条边只能被走c次,每条边上都有电线, 第一个人通过的时候,不会破坏电线,从第二个人开始,每次都有概率p破坏掉电线。使得每个人都能吃饭,求最小破坏电线的概率。 分析 一开始想的是网络流,不太敢确定 我们求最小破坏电线的概率,就是求1 - 最不破坏电线的概率,我们把每天边权改成1 - pip_ipi​,然后考虑用网络流解决这个问题 但是网络流的费用是相加的,这里的概率显然要乘,怎么处理呢,考虑把费用loglo

tlyzxc的博客 163

(网络流)洛谷P3254圆桌问题

洛谷P3254圆桌问题 思路: 最近做到的最舒服的网络流了。 源点向每个单位建边,权值为rir_iri​; 每个单位向每个餐桌建边,权值为111; 每个餐桌向汇点建边,权值为cic_ici​; 如果跑最大流的结果为∑ri\sum r_i∑ri​的话就是可以分配的。 代码: #include<bits/stdc++.h> #define pii pair<int,int> #define int long long #define cl(x,y) memset(x,y,sizeof(x

Z7784562的博客 304

【网络流24题】餐巾计划问题

建边有技巧啊,要拆点。 网络流建边的核心规律就是多做题一定是从源点到汇点,根据此构建模型即可。 \(dinic\) 实现最小费用流 /* @Date : 2019-07-16 11:10:42 @Author : Adscn (adscn@qq.com) @Link : https://www.cnblogs.com/LLCSBlog */ #include<bits/stdc...

weixin_30888413的博客 79

「网络流挖坑大全」最大流最小割 错误点记录

2018年12月27日 天气:阴 心情:一般 because!——学网络流第二、三道题就WA,查错花了INF的时间 今天作为学习网络流的第二天,本人决定潜心研究记录网络流的错题 悼念我昨天的晚自修,没有去陪h^ovey——别打我!我错了!顺便补上昨天的错题 Ⅰ、炸点优化对象炸弄错了 [BJOI2006]狼抓兔子 WA Code: int Dinic(int k,int flow) { if...

weixin_30697239的博客 175

bzoj1711【Usaco2007 Open】Dingin 吃饭

网络流

AaronPolaris 3191

[USACO07OPEN]吃饭Dining

Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will consume no others. Farmer John has cooked fabulous meals for his cows, but he forgot to check his men...

青烟绕指柔的博客 392
上一篇: 【24题】试题库问题【网络流】
下一篇: 蜥蜴【网络流】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值