洛谷P2050 [NOI2012]美食节
动态加边网络流
- #include<cstdio>
- #include<cstdlib>
- #include<algorithm>
- #include<cstring>
- #include<vector>
- #include<queue>
- #define rint register int
- #define ll int
- #define MAXN 100005+10
- #define pb push_back
- #define INF 0x7f7f7f7f
- #define oo 0x7f7f7f7f7f7f7f7f
- #define pil pair<int,ll>
- #define mp make_pair
- #define ft first
- #define sc second
- using namespace std;
- int read(){
- int x=,f=;char ch=getchar();
- while(ch<''||ch>''){if('-'==ch)f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
- return x*f;
- }
- struct E{
- int from,to,cap,flow;
- ll cost;
- E(int x=,int y=,int c=,int f=,ll w=0LL){
- from=x,to=y,cap=c,flow=f,cost=w;
- }
- };
- int N,M,s,t=MAXN-;
- vector<E> es;
- vector<int> G[MAXN];
- void add(int x,int y,int cap,ll cost){
- es.pb(E(x,y,cap,,cost));
- es.pb(E(y,x,,,-cost));
- M=es.size();
- G[x].pb(M-),G[y].pb(M-);
- }
- int p[MAXN],a[MAXN];
- ll d[MAXN];
- int b[MAXN];
- bool SPFA(int &flow,ll &cost){
- p[s]=,a[s]=INF;
- memset(d,0x7f,sizeof(d));
- d[s]=;
- memset(b,,sizeof(b));
- b[s]=;
- queue<int> q;
- q.push(s);
- while(!q.empty()){
- int x=q.front();q.pop();b[x]=;
- for(rint i=;i<G[x].size();i++){
- E &e=es[G[x][i]];
- if(e.cap>e.flow&&d[e.to]>d[x]+e.cost){
- p[e.to]=G[x][i];
- a[e.to]=min(a[x],e.cap-e.flow);
- d[e.to]=d[x]+e.cost;
- if(!b[e.to]){
- b[e.to]=;
- q.push(e.to);
- }
- }
- }
- }
- if(oo==d[t]){
- return ;
- }
- flow+=a[t];
- cost+=a[t]*d[t];
- for(rint i=t;i!=s;i=es[p[i]].from){
- es[p[i]].flow+=a[t];
- es[p[i]^].flow-=a[t];
- }
- return ;
- }
- pil MaxfMinc(){
- int flow=;
- ll cost=0LL;
- while(SPFA(flow,cost));
- return mp(flow,cost);
- }
- int n,m;
- int P[],T[][],now[];
- int sum,L;
- int cook[MAXN],cnt[MAXN];
- int id[][];
- int work(int x,int y){
- add(id[x][y],t,,);
- for(rint i=;i<=n;i++){
- add(L+i,id[x][y],,T[i][x]*y);
- }
- }
- void init(){
- n=read(),m=read();
- for(rint i=;i<=n;i++){
- P[i]=read();
- sum+=P[i];
- }
- for(rint i=;i<=n;i++){
- for(rint j=;j<=m;j++){
- T[i][j]=read();
- }
- }
- L=m*sum;
- int idx=;
- for(rint i=;i<=m;i++){
- for(rint j=;j<=sum;j++){
- id[i][j]=++idx;
- cook[idx]=i,cnt[idx]=j;
- }
- }
- for(rint i=;i<=n;i++){
- add(s,L+i,P[i],);
- }
- for(rint i=;i<=m;i++){
- work(i,);
- now[i]=;
- }
- }
- void solve(){ int flow=;ll cost=0LL;
- while(SPFA(flow,cost)){
- if(flow==sum){
- printf("%lld\n",cost);
- break;
- }
- int x=es[p[t]].from;
- now[cook[x]]++;
- work(cook[x],now[cook[x]]);
- }
- }
- int main()
- {
- // freopen("data.in","r",stdin);
- init();
- solve();
- return ;
- }
洛谷P2050 [NOI2012]美食节的更多相关文章
- 洛谷$P2050\ [NOI2012]$美食节 网络流
正解:网络流 解题报告: 传送门$QwQ$ 昂开始看到$jio$得,哇长得好像上一题嗷$QwQ$ 然后仔细康康数据范围,发现,哇好像要几万个点,,,显然就$GG$了 但感$jio$思路方向好对的亚子? ...
- Solution -「NOI 2012」「洛谷 P2050」美食节
\(\mathcal{Description}\) Link. 美食节提供 \(n\) 种菜品,第 \(i\) 种的需求量是 \(p_i\),菜品由 \(m\) 个厨师负责制作,第 \(j\) ...
- P2050 [NOI2012]美食节
题目地址:P2050 [NOI2012]美食节 先来讲一下P2053 [SCOI2007]修车(如果会做请跳过) 同一时刻有 \(N\) 位车主带着他们的爱车来到了汽车维修中心.维修中心共有 \(M\ ...
- P2050 [NOI2012]美食节(费用流)
P2050 [NOI2012]美食节 P2053 [SCOI2007]修车的加强版 因为数据较大,一次性把所有边都加完会T 于是我们每次只连需要的边跑费用流 就是开始先连所有厨师做倒数第1道菜 跑费用 ...
- 洛谷P2050 美食节
修车加强版.发现每个厨师拆成p个点太浪费了,毕竟总共用到的才p个点.于是从下往上一个一个加,加到满流就停. 论动态加点费用流的正确姿势...... 我自己加总是出现负环...我是每次加一整层,然后跑完 ...
- 洛谷P2179 [NOI2012]骑行川藏(拉格朗日乘数法)
题面 传送门 题解 看\(mashirosky\)大佬的题解吧--这里 //minamoto #include<bits/stdc++.h> #define R register #def ...
- [洛谷P2044][NOI2012]随机数生成器
题目大意:给你$m,a,c,X_0,n,g$,求$X_{n+1}=(a\cdot X_n+c) \bmod{m}$,最后输出对$g$取模 题解:矩阵快速幂+龟速乘,这里用了$long\;double$ ...
- 洛谷 P2044 [NOI2012]随机数生成器
题意简述 读入X[0], m, a, c, n和g $ X[n+1]=(a*X[n]+c)\mod m $ 求X数列的第n项对g取余的值. 题解思路 矩阵加速 设\[ F=\begin{bmatrix ...
- P2050 [NOI2012]美食节 动态连边优化费用流
题意 类似的一道排队等候,算最小总等待时间的题目. 思路 但是这道题的边数很多,直接跑会tle,可以动态加边,就是先连上倒数第一次操作的边,跑一遍费用流,然后对使用了倒数第一条边的点,连上相应的倒数第 ...
随机推荐
- [Android]上传到多个Maven仓库的Gradle插件RapidMavenPushPlugin
博客搬迁至https://blog.wangjiegulu.com RSS订阅:https://blog.wangjiegulu.com/feed.xml RapidMavenPushPlugin 用 ...
- js 从一个函数中传递值到另一个函数
一个函数的调用大家都会用 我今天在调接口的时候突然发现需要引用个另一个函数中拿到的值 举个栗子 刚开始 我是这样调用的 alert弹出的是 hello world . 但是我a函数内部还有一个函数 画 ...
- 07-TypeScript的For循环
在传统的JavaScript中,关于循环,可以有两种方式,一种是forEach,一种是for. forEach的用法如下: var sarr=[1,2,3,4]; sarr.desc="he ...
- api-gateway实践(01)服务网关 - 原型功能
一.服务注册 1.增加组:LsqGrpA 2.增加版本:LsqVerA 3.增加api:LsqApiA 3.1.基本信息 3.2.前端定义 3.3.后端定义 二.服务上线和服务授权 1.服务上线 2. ...
- 05_Linux目录文件操作命令2_我的Linux之路
这一节我们继续来学习Linux中对文件和目录的操作命令 mkdir 创建目录 mkdir (选项)(参数) 在Linux端可以使用mkdir来创建目录,如果你没有加其他的路径名,那么默认是在当前目录下 ...
- django中图片的上传和显示
上传图片实际上是 把图片存在服务器的硬盘中,将图片存储的路径存在数据库中. 1 首先要配置文件上传的路径: 1.1 建立静态文件目录 在项目根目录下 新建一个 static文件夹,下面再建立一个med ...
- shell:正则表达式和文本处理器
1.什么是正则 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. 生活中处处都是正则: 比如我们描述:4条腿 你可能会想 ...
- JavaScript的基础学习
由js和python想到的: 弱类型语言 js 中的数据在进行算数运算时,会自动转换类型强类型语言 变量的值的数据类型一旦确定,使用时不能改变 动态语言:编译时不知道数据类型,只有在执行时才知道数据类 ...
- hdu1045 Fire Net---二进制枚举子集
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意: 给你一幅n*n的图,再给你一些点,这些点的上下左右不能再放其他点,除非有墙('X') ...
- else语句的搭配
1.else语句搭配if 要么怎样,要么怎样 2.else语句搭配for和while 干完循环之后执行else,干不完或者break就不执行 3.else与异常处理 没有问题的话就执行else吧