BZOJ1280 Emmy卖猪pigs 网络流
正解:网络流
解题报告:
我网络流的基础题都还麻油做完就来做这个了,,,wsl,,,
首先想下最基础的构图方法
不难想到把猪圈和顾客分别当做节点,然后新建一个源点和汇点
然后考虑怎么连边,首先肯定要
源点向初始猪圈连权值为猪圈内猪的个数的边
顾客向汇点连权值为购买上限的边
猪圈向顾客连权值为inf的边
然后关键就是怎么表示出来猪圈之间是可以相互调配的昂QAQ
然后就考虑把每个猪圈拆成n个点,表示这n轮,然后表示起来就很简单了昂
相同的猪圈之间连inf的边
同一轮打开的猪圈之间连inf的边
但是这时候发现,边太多了,会T,考虑要么转变建图方式要么优化
先看优化趴
那首先可以想到最后一轮麻油打开的猪圈可以删了,显然它们是不会有贡献了的
然后如果有几个点的来源是相同的,显然它们可以缩成一个点的
如果有几个点的去向是相同的,显然也是可以缩成一个点的
如果从u到v的流量是inf而且v除了u麻油别的流量来源了同样也是能缩成一个点的
然后仔细梳理一下,发现如果按照这些原则,其实就相当于是有了个新的建图方式,下面大概港下规则
首先每个顾客是一个节点不变
然后对每个猪圈的第一个顾客,由源点向它连权值为最初这个猪圈中猪的个数的边,如果有很多条就合并成一条就好
然后对每个猪圈的所有顾客,按顺序从前一个连向后一个
最后从每个顾客向汇点连权值为购买上限的边就好
这样子建图就能保证,只有O(N)级别的点的个数,就欧克了QAQ
而且其实这样子建图也是可以用思路正常解释出来的QAQ
大概就是,可以把每个人看做一个调度站,就是说他能调度一部分猪圈里猪的数量,当下一个人需要的时候就分一些给下一个人就好,不知道讲清楚麻油,,,意会着理解下QAQ?
最后总结一下,对这种网络流的问题,如果实在麻油什么很优秀的想法的时候,可以先考虑暴力建图,然后再慢慢考虑优化,再想到更好的建图思路
over!
最后关于那个,我说的建图过程,其实是有点儿难建的,,,?我我我我想不到什么好方法就直接瞎搞了,就开了个数组,用了点儿链表的思想暴力存QAQ
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rg register
#define ri rg int
#define rc rg char
#define rb rg bool
#define gc getchar()
#define t(i) edge[i].to
#define w(i) edge[i].wei
#define rp(i,x,y) for(rg int i=x;i<=y;++i)
#define my(i,y,x) for(rg int i=x;i>=y;--i)
#define e(i,x) for(rg int i=head[x];i!=-1;i=edge[i].nxt) const int N=+,M=+,inf=1e8;
int n,m,a[M],nw_to[M],ed_cnt=-,flow,head[N],dep[N],st,to;
struct ed{int to,nxt,wei;}edge[(N<<)*];
queue<int>Q; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void ad(ri x,ri y,ri z){edge[++ed_cnt]=(ed){y,head[x],z};head[x]=ed_cnt;}
il bool bfs()
{
Q.push(st);memset(dep,,sizeof(dep));dep[st]=;
while(!Q.empty())
{
ri nw=Q.front();Q.pop();
e(i,nw)if(!dep[t(i)] && w(i))Q.push(t(i)),dep[t(i)]=dep[nw]+;
}
return dep[to];
}
il int dfs(ri nw,ri f)
{
if(nw==to || !f)return f;ri ret=,tmp;
e(i,nw)if(dep[t(i)]==dep[nw]+ && w(i))if(tmp=dfs(t(i),min(f,w(i))))f-=tmp,ret+=tmp,w(i)-=tmp,w(i^)+=tmp;
return ret;
}
il int dinic(){while(bfs())flow+=dfs(st,inf);return flow;} int main()
{
// freopen("1.in","r",stdin);freopen("pig.out","w",stdout);
m=read();n=read();rp(i,,m)a[i]=read();st=n+;to=n+;memset(head,-,sizeof(head));
rp(i,,n)
{
ri num=read(),wei=;
while(num--)
{
ri tmp=read();
if(!nw_to[tmp])wei+=a[tmp],nw_to[tmp]=i;
else ad(nw_to[tmp],i,inf),ad(i,nw_to[tmp],),nw_to[tmp]=i;
}
num=read();ad(i,to,num);ad(to,i,);if(wei)ad(st,i,wei),ad(i,st,);
}
printf("%d\n",dinic());
return ;
}
这儿是代码QAQ
BZOJ1280 Emmy卖猪pigs 网络流的更多相关文章
- BZOJ1280: Emmy卖猪pigs
BZOJ1280: Emmy卖猪pigs https://lydsy.com/JudgeOnline/problem.php?id=1280 分析: 这题感觉还好,因为是有时间顺序,所以拆点做最大流即 ...
- 【BZOJ1280】Emmy卖猪pigs 最大流
[BZOJ1280]Emmy卖猪pigs Description Emmy在一个养猪场工作.这个养猪场有M个锁着的猪圈,但Emmy并没有钥匙.顾客会到养猪场来买猪,一个接着一个.每一位顾客都会有一些猪 ...
- [BZOJ1280][POJ1149]Emmy卖猪pigs
[BZOJ1280][POJ1149]Emmy卖猪pigs 试题描述 Emmy在一个养猪场工作.这个养猪场有 \(M\) 个锁着的猪圈,但Emmy并没有钥匙.顾客会到养猪场来买猪,一个接着一个.每一位 ...
- Bzoj 1280: Emmy卖猪pigs
1280: Emmy卖猪pigs Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 279 Solved: 182[Submit][Status][Dis ...
- Pku1149 PIGS 卖猪
题目链接:ヾ(≧∇≦*)ゝ Description Emmy在一个养猪场工作.这个养猪场有M个锁着的猪圈,但Emmy并没有钥匙. 顾客会到养猪场来买猪,一个接着一个.每一位顾客都会有一些猪圈的钥匙,他 ...
- [bzoj1280]卖猪
首先考虑猪无法流动,那么源点向每一个猪圈连猪圈中猪个数的边,每一个顾客向汇点连所需猪的边,每一个猪圈向能打开它的顾客连inf的边,跑最大流即可. 但考虑猪要流动,有一个十分巧妙地做法,将每一个顾客所有 ...
- POJ 1149:PIGS 网络流经典题
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18345 Accepted: 8354 Description ...
- poj 1149 Pigs 网络流-最大流 建图的题目(明天更新)-已更新
题目大意:是有M个猪圈,N个顾客,顾客要买猪,神奇的是顾客有一些猪圈的钥匙而主人MIRKO却没有钥匙,多么神奇?顾客可以在打开的猪圈购买任意数量的猪,只要猪圈里有足够数量的猪.而且当顾客打开猪圈后mi ...
- 【poj1149】 pigs 网络流最大流问题
描述 Description 尼克在一家养猪场工作,这家养猪场共有M间锁起来的猪舍,由于猪舍的钥匙都给了客户,所以尼克没有办法打开这些猪舍,客户们从早上开始一个接一个来购买生猪,他们到达后首先用手中的 ...
随机推荐
- 海量数据中找top K专题
1. 10亿个数中找出最大的1000个数 这种题目就是分治+堆排序. 为啥分治?因为数太多了,全部加载进内存不够用,所以分配到多台机器中,或者多个文件中,但具体分成多少份,视情况而定,只要保证满足内存 ...
- Navi.Soft31.微信WinForm框架(含下载地址)
1.概述 1.1应用场景 微信的出现,改变了我们日常生活.而微信公众平台的出现,使我们每个人都可能成为一个品牌,微商的普及.微店越来越多.越来越多的人,借助微信公众平台,实现了自己的梦想 在此背景环境 ...
- Android5.0通知变化浅析
目前在Android中通知的使用还是很常见的,为了做版本兼容,常用兼容包NotificationCompat.Builder和 Notification.Builder. NotificationCo ...
- C艹目录
c++ 学习路线 c++学习路线 c++ 学习目录 c++ 常用数据类型,命名规则, 不常有数据类型 C++复合类型(数组) C艹复合类型(字符串) C++复合类型(结构体) C++ 结构体和枚举 ...
- Mybatis使用MySQL模糊查询时输入中文检索不到结果怎么办--转自http://www.jb51.net/article/88236.htm
这篇文章主要介绍了Mybatis使用MySQL模糊查询时输入中文检索不到结果的解决办法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 项目开发中,在做Mybatis动态查询时,遇到了 ...
- 仿迅雷播放器教程 -- 提取exe资源(12)
既然选择了一个界面库,那么咱们就开始吧! 既然是仿迅雷播放器,那当然要把迅雷播放器的资源提取出来啦,但是很多小伙伴可能不知道怎么提取,所以这里就教大家一些方法: 一.传统的资源提取器 ...
- 【Oracle】删除所有表
BEGIN FOR cur_rec IN (SELECT object_name, object_type FROM user_objects WHERE object_type IN ('TABLE ...
- Docker的概念术语(2)
Docker是什么? Docker是开发人员和系统管理员使用容器开发,部署和运行应用程序的平台.使用Linux容器部署应用程序称为容器化.Linux容器不是一个全新的概念,它们用于轻松部署应用程序. ...
- cocos2d-x游戏引擎核心(3.x)----启动渲染流程
(1) 首先,这里以win32平台下为例子.win32下游戏的启动都是从win32目录下main文件开始的,即是游戏的入口函数,如下: #include "main.h" #inc ...
- B - Calculation 2
Given a positive integer N, your task is to calculate the sum of the positive integers less than N w ...