正题

题目链接:https://www.luogu.com.cn/problem/P2050


题目大意

nnn个菜品mmm个厨师,第iii种菜需要pip_ipi​份,第iii个人做第jjj道菜需要时间ti,jt_{i,j}ti,j​,求最少等待时间和。


解题思路

这题和之前修车很像,数据变大了。

考虑网络流,如果一个厨师总共要做kkk个菜,那么第iii个菜的时间贡献就是(k−i+1)∗t(k-i+1)*t(k−i+1)∗t,反过来看,做倒数第iii道菜的时间贡献就是i∗ti*ti∗t。

也就是如果目前厨师要做kkk道菜,那么在最开头加入一个新菜时需要增加的时间就是(k+1)∗t(k+1)*t(k+1)∗t。

定义点阵(i,j)(i,j)(i,j)表示第iii个厨师做到第jjj道菜,然后和顾客构建二分图,联向第jjj道菜的费用乘上jjj即可,因为是最小费用所以肯定会优先把小费用的边流掉。

这样正确性已经保证,但是空间复杂度显然不行。考虑动态连边,因为肯定会先流小费用,所以当小费用的有流时在动态加入更大费用的一条边即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define p1(x,y) (((x)-1)*K+(y))
#define p2(x) (p1(m,K)+(x))
using namespace std;
const int N=1e5+10;
struct node{int to,next,w,c;
}a[N*70];
int n,m,ans,tot=1,s,t,K;
int e[50][110],k[50];
int ls[N],f[N],mf[N],pre[N],mark[N];
bool v[N];
queue<int> q;
void addl(int x,int y,int w,int c){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;a[tot].c=c;a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;a[tot].c=-c;return;
}
bool SPFA(){memset(f,0x3f,sizeof(f));f[s]=0;q.push(s);v[s]=1;mf[s]=2147483647;while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(a[i].w&&f[x]+a[i].c<f[y]){f[y]=f[x]+a[i].c;mf[y]=min(mf[x],a[i].w);pre[y]=i;if(!v[y]){v[y]=1;q.push(y);}}}v[x]=0;}return f[t]<=2147483647/3;
}
void updata(){int x=t;while(x!=s){a[pre[x]].w-=mf[t];a[pre[x]^1].w+=mf[t];if(x==t&&(a[pre[x]^1].to%K)>0){int y=a[pre[x]^1].to;int c=y%K+1,pos=mark[y];for(int i=1;i<=n;i++)addl(p2(i),p1(pos,c),1,e[i][pos]*c);addl(p1(pos,c),t,1,0);mark[p1(pos,c)]=pos;}x=a[pre[x]^1].to;}ans+=mf[t]*f[t];
}
void net_flow(){while(SPFA())updata();
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&k[i]),K+=k[i];for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&e[i][j]);s=p2(n)+1;t=s+1;for(int i=1;i<=n;i++)addl(s,p2(i),k[i],0),mark[p2(i)]=i;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++)addl(p2(j),p1(i,1),1,e[j][i]);addl(p1(i,1),t,1,0);mark[p1(i,1)]=i;}net_flow();printf("%d",ans);
}

P2050-[NOI2012]美食节【费用流,动态连边】相关推荐

  1. [BZOJ2879] [Noi2012] 美食节 (费用流 动态加边)

    Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...

  2. [NOI2012]美食节——费用流(带权二分图匹配)+动态加边

    题目描述 小M发现,美食节共有n种不同的菜品.每次点餐,每个同学可以选择其中的一个菜品.总共有m个厨师来制作这些菜品.当所有的同学点餐结束后,菜品的制作任务就会分配给每个厨师.然后每个厨师就会同时开始 ...

  3. [NOI2012]美食节(费用流)

    题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都 ...

  4. P2050 [NOI2012]美食节

    传送门 看一眼,这不是修车原题吗? 把厨师拆成 $n*m$ 个点,第 $k$ 种菜连向第 $i$ 个厨师的第 $j$ 个点表示第 $i$ 个厨师倒数做的第 $j$ 个菜是 $k$ 可以发现厨师 $i$ ...

  5. jzoj3302-[集训队互测2013]供电网络【上下界网络流,费用流,动态加边】

    正题 题目大意 若干个城市一些城市有一定的电,有些城市需要一定的电.对于第iii个城市购买一个电需要iniin_iini​,送出电需要outiout_iouti​.当然城市之间也可以相互传输电. 对于 ...

  6. 5331. 【NOIP2017提高A组模拟8.23】壕游戏 费用流 动态连边

    题意:n个点m条边,每条边有一个经过次数限制ci,假设经过了x次,第x次费用为ai*x+bi,有s个终点,要跑k次,问最小总费用多少. 巨鬼畜,连边只按照第一次的连,然后费用流的时候每流一条边然后再连 ...

  7. BZOJ 2879 美食节(费用流-动态加边)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2879 题意:有n道菜,每道菜需要b[i]份,m个厨师,第j个厨师做第i道菜需要时间a[i ...

  8. [NOI2012(bzoj2879)(vijos1726)]美食节 (费用流)

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 2288  Solved: 1207 [Submit][Stat ...

  9. [BZOJ2879][Noi2012]美食节(费用流)

    Address 洛谷P2050 BZOJ2879 LOJ#2674 Solution 一看发现和 SCOI2007 修车 是一样的. 这里再说一下建图: 把每个厨师拆成 ∑ i = 1 n p i \ ...

最新文章

  1. MFC第三节-多线程
  2. JavaScript中this的五种绑定方式详解
  3. ECCV 2018 | CornerNet:目标检测算法新思路
  4. linux c ip数据包,如何在Linux上的C / C ++中使用ipv6 udp套接字进行多播?
  5. ADO.NET DataSet 数据模型
  6. java udp简单聊天程序_Java基于UDP协议实现简单的聊天室程序
  7. python span镶嵌匹配_python模式匹配,提取指定字段
  8. 从 200 多篇顶会论文看预训练语言模型研究进展
  9. 乐pad平板电脑_2020年双十一高性价比平板电脑推荐(包含苹果ipad,安卓华为,微软surface)...
  10. 你们喜欢一个人旅行,还是有人陪伴旅行?
  11. lombok标签_微服务之:springboot入门、Swagger、Lombok使用
  12. python 动态加载代码_python 动态网页爬取?(不是加载更多页的动态网页哟)?...
  13. 人工智能算法 上市公司,人工智能算法公司排名
  14. Python 实现大量图片裁剪拼接并生成PDF
  15. C语言实现拟合直线方程
  16. 一款极简的原生农历日期滚动选择器(小程序版本)体积小,速度快
  17. PHP 微信JSP支付
  18. 基于华为鲲鹏云的c语言程序设计,华为DevRun第四讲,华为云鲲鹏云服务移植快速入门与实践...
  19. 次要和主要等位基因的定义
  20. Android-开发之从掉洞到填坑之路,android开发规范阿里

热门文章

  1. layui 如何去dom_javascript 怎么去引用layui里面的方法
  2. linux内核线程socket,从Linux源码看Socket(TCP)的accept
  3. mysql使用索引下推的好处_mysql的索引下推理解和实践
  4. python tablewidget 颜色_QT中,QTableView鼠标移动到item上时该item所在行的背景颜色变成其他颜色,这要怎么实现...
  5. android t跳转到fragment,Android 使用EventBus进行Fragment和Activity通信
  6. 问题 B: 数塔问题
  7. 计算机二级和英语四六级是同一个账号吗,英语四六级考试和计算机考试的登录账号和密码一样吗?我好像混了,但是密码一直输不对,...
  8. 计算机检测维修与数据恢复课件,2017年全国职业院校技能大赛中职组“计算机检测维修与数据恢复”赛项说明会ppt课件.ppt...
  9. html5访问本地资源,HTML5实现一个访问本地文件的实例今
  10. [RabbitMQ]创建Java开发环境_消费者_生产者