传送门

看一眼,这不是修车原题吗?

把厨师拆成 $n*m$ 个点,第 $k$ 种菜连向第 $i$ 个厨师的第 $j$ 个点表示第 $i$ 个厨师倒数做的第 $j$ 个菜是 $k$

可以发现厨师 $i$ 做的倒数第 $j$ 个菜的贡献是 $j*time[i][j]$ ($time[i][j]$ 表示厨师 $i$ 做第 $j$ 种菜需要的时间)

连边 $(S,k,num[k],0)$ 表示第 $k$ 种菜要做 $num[k]$ 个

连边 $(k,cooker[i][j],1,j*time[i][k])$ 表示第 $k$ 种菜给厨师 $i$ 留到倒数第 $j$ 个做,需要的时间就是 $j*tim[i][k]$

连边 $(cooker[i][j],T,1,0)$ 表示厨师不能同时做好几种菜

然后跑最小费用最大流

然后 $T$ 成 $60$ 分...

考虑优化,发现费用流时的时间主要耗在玄学的 $SPFA$ 上了,发现 $SPFA$ 的复杂度和边数有很大关系

考虑删掉没用的边

但是,好像每一条边都有用...

考虑一下费用流的过程,每次只找一条增广路,并且显然厨师一定不会闲着(不会出现第 $i$ 个位置没有流,第 $i+1$ 个位置有流)

所以我们可以动态地加边,每次找完一条增广路后再加可能会用到的边

具体看代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
inline int read()
{int x=0,f=1; char ch=getchar();while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }return x*f;
}
const int N=1e5+7,M=1e7+7,INF=1e9+7;
int fir[N],from[M],to[M],val[M],cst[M],cntt=1;
inline void add(int a,int b,int c,int d)
{from[++cntt]=fir[a]; fir[a]=cntt;to[cntt]=b; val[cntt]=c; cst[cntt]=d;from[++cntt]=fir[b]; fir[b]=cntt;to[cntt]=a; val[cntt]=0; cst[cntt]=-d;
}
int dis[N],mif[N],pre[N],S,T;
queue <int> q;
bool inq[N];
bool SPFA()
{for(int i=S;i<=T;i++) dis[i]=INF;q.push(S); inq[S]=1; dis[S]=0,mif[S]=INF;while(!q.empty()){int x=q.front(); q.pop(); inq[x]=0;for(int i=fir[x];i;i=from[i]){int &v=to[i]; if(!val[i]||dis[v]<=dis[x]+cst[i]) continue;dis[v]=dis[x]+cst[i]; pre[v]=i;mif[v]=min(mif[x],val[i]);if(!inq[v]) q.push(v),inq[v]=1;}}return dis[T]<INF;
}
int n,m,p[2007][2007],tot;//p[i][j]表示第i种菜给第j个厨师需要的时间
ll ans;
void upd()
{for(int now=T,i=pre[T]; now!=S; now=to[i^1],i=pre[now])val[i]-=mif[T],val[i^1]+=mif[T];ans+=1ll*mif[T]*dis[T];int v=to[pre[T]^1],u=(v-n-1)/tot+1,t=(v-n)%tot;//u存厨师,t存此时是倒数第几个做的菜add(v+1,T,1,0);//向厨师的下一个点连边for(int i=1;i<=n;i++) add(i,v+1,1,p[i][u]*(t+1));//每个菜都可以让此厨师做
}
int main()
{n=read(),m=read(); int a;for(int i=1;i<=n;i++) a=read(),add(S,i,a,0),tot+=a;S=0,T=n+m*tot+1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) { p[i][j]=read(); add(i,n+(j-1)*tot+1,1,p[i][j]); }//初始边for(int i=1;i<=m;i++) add(n+(i-1)*tot+1,T,1,0);//初始边while(SPFA()) upd();printf("%lld",ans);return 0;
}

转载于:https://www.cnblogs.com/LLTYYC/p/10792765.html

P2050 [NOI2012]美食节相关推荐

  1. bzoj2879: [Noi2012]美食节

    bzoj2879: [Noi2012]美食节 题意 有n(<=40)道菜,第i道菜被点了pi(∑p<=800)次;有m(<=100)个人,第i个人做第j道菜用时tij(<=10 ...

  2. 2879: [Noi2012]美食节

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

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

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

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

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

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

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

  6. noi2012美食节

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

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

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

  8. NOI2012 美食节

    http://www.lydsy.com/JudgeOnline/problem.php?id=2879 费用流. 我们发现,每个厨师做的倒数第k道菜对总等待时间的贡献为k*做这道菜的时间. 将每个厨 ...

  9. 「BZOJ2879」[Noi2012]美食节

    这道题就是 「BZOJ1070」[SCOI2007]修车 的加强版 如果一开始把全部边连上会T 优化的方法是只连用到过和下一次增广可能用到的边. 1 #include<bits/stdc++.h ...

最新文章

  1. python爬虫requests-Python爬虫之requests介绍
  2. 地方高考信息管理系统方案
  3. vue取通过key取value_vue怎么获取radio、checkbox选中的值
  4. python ttf svg path_SVG的path的使用
  5. 使用Gradle消除开发重新部署
  6. vue+element 封装公共js代码
  7. 十个让你变成糟糕的程序员的行为
  8. 【Unity】Geometry Shader实现
  9. Instruments-Automation: 通过命令行执行测试用例
  10. 【数据结构笔记】哈夫曼树的构造算法
  11. WordPress模板iDowns1.8.3+支持对接Erphpdown
  12. 深度学习——分类网络的总结(持续更新ing~)
  13. 不同比例尺地形图上,典型地物的表示方法
  14. ERROR2002(HY000):CantconnecttolocalMySQLserverthroughsocket/tmp/mys
  15. 【父亲节故事】32岁入门学习编程的父亲给我的启示
  16. 聊聊我在阿里所经历的新零售业务商品中心微服务化的过程
  17. anchors.fill和anchors.centerIn区别
  18. Kubernetes 之 二进制安装(二) 证书详解
  19. 大厂卡你的学历,究竟是为了什么?
  20. Springboot快速实现邮件发送

热门文章

  1. php加密登录_PHP写一个简单的网页加密认证
  2. java内存区域_JVM学习之—Java内存区域
  3. 只下载pycharm不安装python可以用吗_pycharm下怎么配置python
  4. java 无类名实现接口_为什么很多人写 Java/Android 时,选择让同一个类实现多个接口,而不是用多个内部匿名类?...
  5. 黑苹果挂载不了分区_让黑苹果变得更完美——BCM94532HMB无线蓝牙接力完美驱动!...
  6. asp.core api 通过socket和服务器通信发送udp_python socket之TCP/UDP
  7. html js不触发_图文详解鼠标事件CSS:hover和JS:mouseover的区别
  8. dbutils API学习
  9. 关系到了冰点_和丈夫的关系到了冰点,该怎么办?
  10. ad怎么批量改元器件封装_Altium Designer 批量修改元件封装的方法(修正)