动态加边网络流

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<vector>
  6. #include<queue>
  7. #define rint register int
  8. #define ll int
  9. #define MAXN 100005+10
  10. #define pb push_back
  11. #define INF 0x7f7f7f7f
  12. #define oo 0x7f7f7f7f7f7f7f7f
  13. #define pil pair<int,ll>
  14. #define mp make_pair
  15. #define ft first
  16. #define sc second
  17. using namespace std;
  18. int read(){
  19. int x=,f=;char ch=getchar();
  20. while(ch<''||ch>''){if('-'==ch)f=-;ch=getchar();}
  21. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  22. return x*f;
  23. }
  24. struct E{
  25. int from,to,cap,flow;
  26. ll cost;
  27. E(int x=,int y=,int c=,int f=,ll w=0LL){
  28. from=x,to=y,cap=c,flow=f,cost=w;
  29. }
  30. };
  31. int N,M,s,t=MAXN-;
  32. vector<E> es;
  33. vector<int> G[MAXN];
  34. void add(int x,int y,int cap,ll cost){
  35. es.pb(E(x,y,cap,,cost));
  36. es.pb(E(y,x,,,-cost));
  37. M=es.size();
  38. G[x].pb(M-),G[y].pb(M-);
  39. }
  40. int p[MAXN],a[MAXN];
  41. ll d[MAXN];
  42. int b[MAXN];
  43. bool SPFA(int &flow,ll &cost){
  44. p[s]=,a[s]=INF;
  45. memset(d,0x7f,sizeof(d));
  46. d[s]=;
  47. memset(b,,sizeof(b));
  48. b[s]=;
  49. queue<int> q;
  50. q.push(s);
  51. while(!q.empty()){
  52. int x=q.front();q.pop();b[x]=;
  53. for(rint i=;i<G[x].size();i++){
  54. E &e=es[G[x][i]];
  55. if(e.cap>e.flow&&d[e.to]>d[x]+e.cost){
  56. p[e.to]=G[x][i];
  57. a[e.to]=min(a[x],e.cap-e.flow);
  58. d[e.to]=d[x]+e.cost;
  59. if(!b[e.to]){
  60. b[e.to]=;
  61. q.push(e.to);
  62. }
  63. }
  64. }
  65. }
  66. if(oo==d[t]){
  67. return ;
  68. }
  69. flow+=a[t];
  70. cost+=a[t]*d[t];
  71. for(rint i=t;i!=s;i=es[p[i]].from){
  72. es[p[i]].flow+=a[t];
  73. es[p[i]^].flow-=a[t];
  74. }
  75. return ;
  76. }
  77. pil MaxfMinc(){
  78. int flow=;
  79. ll cost=0LL;
  80. while(SPFA(flow,cost));
  81. return mp(flow,cost);
  82. }
  83. int n,m;
  84. int P[],T[][],now[];
  85. int sum,L;
  86. int cook[MAXN],cnt[MAXN];
  87. int id[][];
  88. int work(int x,int y){
  89. add(id[x][y],t,,);
  90. for(rint i=;i<=n;i++){
  91. add(L+i,id[x][y],,T[i][x]*y);
  92. }
  93. }
  94. void init(){
  95. n=read(),m=read();
  96. for(rint i=;i<=n;i++){
  97. P[i]=read();
  98. sum+=P[i];
  99. }
  100. for(rint i=;i<=n;i++){
  101. for(rint j=;j<=m;j++){
  102. T[i][j]=read();
  103. }
  104. }
  105. L=m*sum;
  106. int idx=;
  107. for(rint i=;i<=m;i++){
  108. for(rint j=;j<=sum;j++){
  109. id[i][j]=++idx;
  110. cook[idx]=i,cnt[idx]=j;
  111. }
  112. }
  113. for(rint i=;i<=n;i++){
  114. add(s,L+i,P[i],);
  115. }
  116. for(rint i=;i<=m;i++){
  117. work(i,);
  118. now[i]=;
  119. }
  120. }
  121. void solve(){ int flow=;ll cost=0LL;
  122. while(SPFA(flow,cost)){
  123. if(flow==sum){
  124. printf("%lld\n",cost);
  125. break;
  126. }
  127. int x=es[p[t]].from;
  128. now[cook[x]]++;
  129. work(cook[x],now[cook[x]]);
  130. }
  131. }
  132. int main()
  133. {
  134. // freopen("data.in","r",stdin);
  135. init();
  136. solve();
  137. return ;
  138. }

洛谷P2050 [NOI2012]美食节的更多相关文章

  1. 洛谷$P2050\ [NOI2012]$美食节 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 昂开始看到$jio$得,哇长得好像上一题嗷$QwQ$ 然后仔细康康数据范围,发现,哇好像要几万个点,,,显然就$GG$了 但感$jio$思路方向好对的亚子? ...

  2. Solution -「NOI 2012」「洛谷 P2050」美食节

    \(\mathcal{Description}\)   Link.   美食节提供 \(n\) 种菜品,第 \(i\) 种的需求量是 \(p_i\),菜品由 \(m\) 个厨师负责制作,第 \(j\) ...

  3. P2050 [NOI2012]美食节

    题目地址:P2050 [NOI2012]美食节 先来讲一下P2053 [SCOI2007]修车(如果会做请跳过) 同一时刻有 \(N\) 位车主带着他们的爱车来到了汽车维修中心.维修中心共有 \(M\ ...

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

    P2050 [NOI2012]美食节 P2053 [SCOI2007]修车的加强版 因为数据较大,一次性把所有边都加完会T 于是我们每次只连需要的边跑费用流 就是开始先连所有厨师做倒数第1道菜 跑费用 ...

  5. 洛谷P2050 美食节

    修车加强版.发现每个厨师拆成p个点太浪费了,毕竟总共用到的才p个点.于是从下往上一个一个加,加到满流就停. 论动态加点费用流的正确姿势...... 我自己加总是出现负环...我是每次加一整层,然后跑完 ...

  6. 洛谷P2179 [NOI2012]骑行川藏(拉格朗日乘数法)

    题面 传送门 题解 看\(mashirosky\)大佬的题解吧--这里 //minamoto #include<bits/stdc++.h> #define R register #def ...

  7. [洛谷P2044][NOI2012]随机数生成器

    题目大意:给你$m,a,c,X_0,n,g$,求$X_{n+1}=(a\cdot X_n+c) \bmod{m}$,最后输出对$g$取模 题解:矩阵快速幂+龟速乘,这里用了$long\;double$ ...

  8. 洛谷 P2044 [NOI2012]随机数生成器

    题意简述 读入X[0], m, a, c, n和g $ X[n+1]=(a*X[n]+c)\mod m $ 求X数列的第n项对g取余的值. 题解思路 矩阵加速 设\[ F=\begin{bmatrix ...

  9. P2050 [NOI2012]美食节 动态连边优化费用流

    题意 类似的一道排队等候,算最小总等待时间的题目. 思路 但是这道题的边数很多,直接跑会tle,可以动态加边,就是先连上倒数第一次操作的边,跑一遍费用流,然后对使用了倒数第一条边的点,连上相应的倒数第 ...

随机推荐

  1. [Android]上传到多个Maven仓库的Gradle插件RapidMavenPushPlugin

    博客搬迁至https://blog.wangjiegulu.com RSS订阅:https://blog.wangjiegulu.com/feed.xml RapidMavenPushPlugin 用 ...

  2. js 从一个函数中传递值到另一个函数

    一个函数的调用大家都会用 我今天在调接口的时候突然发现需要引用个另一个函数中拿到的值 举个栗子 刚开始 我是这样调用的 alert弹出的是 hello world . 但是我a函数内部还有一个函数 画 ...

  3. 07-TypeScript的For循环

    在传统的JavaScript中,关于循环,可以有两种方式,一种是forEach,一种是for. forEach的用法如下: var sarr=[1,2,3,4]; sarr.desc="he ...

  4. api-gateway实践(01)服务网关 - 原型功能

    一.服务注册 1.增加组:LsqGrpA 2.增加版本:LsqVerA 3.增加api:LsqApiA 3.1.基本信息 3.2.前端定义 3.3.后端定义 二.服务上线和服务授权 1.服务上线 2. ...

  5. 05_Linux目录文件操作命令2_我的Linux之路

    这一节我们继续来学习Linux中对文件和目录的操作命令 mkdir 创建目录 mkdir (选项)(参数) 在Linux端可以使用mkdir来创建目录,如果你没有加其他的路径名,那么默认是在当前目录下 ...

  6. django中图片的上传和显示

    上传图片实际上是 把图片存在服务器的硬盘中,将图片存储的路径存在数据库中. 1 首先要配置文件上传的路径: 1.1 建立静态文件目录 在项目根目录下 新建一个 static文件夹,下面再建立一个med ...

  7. shell:正则表达式和文本处理器

    1.什么是正则 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. 生活中处处都是正则: 比如我们描述:4条腿 你可能会想 ...

  8. JavaScript的基础学习

    由js和python想到的: 弱类型语言 js 中的数据在进行算数运算时,会自动转换类型强类型语言 变量的值的数据类型一旦确定,使用时不能改变 动态语言:编译时不知道数据类型,只有在执行时才知道数据类 ...

  9. hdu1045 Fire Net---二进制枚举子集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意: 给你一幅n*n的图,再给你一些点,这些点的上下左右不能再放其他点,除非有墙('X') ...

  10. else语句的搭配

    1.else语句搭配if 要么怎样,要么怎样 2.else语句搭配for和while 干完循环之后执行else,干不完或者break就不执行 3.else与异常处理 没有问题的话就执行else吧