http://www.lydsy.com/JudgeOnline/problem.php?id=2879

费用流。

我们发现,每个厨师做的倒数第k道菜对总等待时间的贡献为k*做这道菜的时间。

将每个厨师拆成P个点,第i个第表示这个厨师做倒数第i道菜。

设Vi,j表示第i个厨师做第j道菜的点。

Ui表示第i道菜。

构图:

S->Vi,j一条流量为1,费用为0的边;

Vi,j->Uk一条流量为1,费用为j*t[k][i]的边;

Ui->T一条流量为p[i],费用为0的边。

但是数据范围比较大,我们可以动态加边。

友情题:SDOI2007修车

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
//#include<bits/stdc++.h>适用于CF,UOJ,但不适用于pojusing namespace std;typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef complex<DB> CP;#define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define re(i,a,b)  for(i=a;i<=b;i++)
#define red(i,a,b) for(i=a;i>=b;i--)
#define fi first
#define se second
#define m_p(a,b) make_pair(a,b)
#define SF scanf
#define PF printf
#define two(k) (1<<(k))template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;}const DB EPS=1e-9;
inline int sgn(DB x){if(abs(x)<EPS)return 0;return(x>0)?1:-1;}
const DB Pi=acos(-1.0);inline int gint(){int res=0;bool neg=0;char z;for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());if(z==EOF)return 0;if(z=='-'){neg=1;z=getchar();}for(;z!=EOF && isdigit(z);res=res*10+z-'0',z=getchar());return (neg)?-res:res; }
inline LL gll(){LL res=0;bool neg=0;char z;for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());if(z==EOF)return 0;if(z=='-'){neg=1;z=getchar();}for(;z!=EOF && isdigit(z);res=res*10+z-'0',z=getchar());return (neg)?-res:res; }const int maxN=40;
const int maxM=100;
const int maxP=800;
const int INF=1<<30;int N,M,P;
int p[maxN+10];
int t[maxN+10][maxM+10];
int S,T,now,first[maxN+maxM*maxP+100];
struct Tedge{int u,v,flow,cost,next;}edge[2*(maxN+maxN*maxM*maxP+maxP*maxM)+10000];inline void addedge(int u,int v,int flow,int cost){now++;edge[now].u=u;edge[now].v=v;edge[now].flow=flow;edge[now].cost=cost;edge[now].next=first[u];first[u]=now;}
inline void insert(int u,int v,int flow,int cost){addedge(u,v,flow,cost);addedge(v,u,0,-cost);}int head,tail,que[maxN+maxM*maxP+100];
int vis[maxN+maxM*maxP+100],dis[maxN+maxM*maxP+100],fromedge[maxN+maxM*maxP+100];
inline int SPFA(){int i;re(i,0,N+P*M+1)vis[i]=0,dis[i]=INF,fromedge[i]=-1;dis[que[0]=S]=0;head=0;tail=1;vis[S]=1;while(head!=tail){int u=que[head++],v,flow,cost;if(head==T)head=0;vis[u]=0;for(i=first[u],v=edge[i].v,flow=edge[i].flow,cost=edge[i].cost;i!=-1;i=edge[i].next,v=edge[i].v,flow=edge[i].flow,cost=edge[i].cost)if(flow>0 && dis[u]+cost<dis[v]){dis[v]=dis[u]+cost;fromedge[v]=i;if(!vis[v]){vis[que[tail]=v]=1;if(dis[que[tail]]<dis[que[head]])swap(que[head],que[tail]);tail++;if(tail==T)tail=0;}}}return dis[T]!=INF;}
inline void work(int &res){int i,x=INF,y,a,b;for(i=fromedge[T];i!=-1;i=fromedge[edge[i].u]){upmin(x,edge[i].flow);if(edge[i].u==S)y=edge[i].v,a=(y-1)/P+1,b=y%P+1;}for(i=fromedge[T];i!=-1;i=fromedge[edge[i].u])edge[i].flow-=x,edge[i^1].flow+=x,res+=x*edge[i].cost;re(i,1,N)insert((a-1)*P+b,P*M+i,1,b*t[i][a]);}
inline int mincostmaxflow(){int res=0;while(SPFA())work(res);return res;}int main(){freopen("delicacy.in","r",stdin);freopen("delicacy.out","w",stdout);int i,j;N=gint();M=gint();mmst(first,-1);now=-1;re(i,1,N)p[i]=gint(),P+=p[i];re(i,1,N)re(j,1,M)t[i][j]=gint();S=0;T=P*M+N+1;re(i,1,P*M)insert(S,i,1,0);re(i,1,N)insert(P*M+i,T,p[i],0);re(i,1,N)re(j,1,M)insert((j-1)*P+1,P*M+i,1,t[i][j]);cout<<mincostmaxflow()<<endl;return 0;}

View Code

转载于:https://www.cnblogs.com/maijing/p/4693592.html

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. noi2012美食节

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

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

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

  7. P2050 [NOI2012]美食节

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

  8. 「BZOJ2879」[Noi2012]美食节

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

  9. [NOI2012]美食节

    题解: 很经典的网络流 对于每个厨师拆点分开统计 1倍 2倍 3倍 n(mp)^2 有点大 动态加边 即对于每个厨师有了i才会有i+1 不过好像还是有点卡常?? 代码: #include <bi ...

最新文章

  1. 前台特效(3) 编辑表格
  2. VTK:几何对象之Planes
  3. IDEA的十大快捷键
  4. 读书笔记 数据化营销
  5. KafkaConsumer源码解析
  6. SAP License:大陆SAP用户清单
  7. 老是原罪?技术圈为何不待见大龄企业家
  8. PySpark︱DataFrame操作指南:增/删/改/查/合并/统计与数据处理
  9. cmake install_CMAKE入门实战
  10. 玩机:解决小米手机锁屏忘记密码无法解锁
  11. Endnote X6大客户版破解版+新功能介绍+视频介绍
  12. 任正非谈管理--读书笔记
  13. ppt快速美化四步法
  14. WWF中Conditioned Activity Group的子Activity扩展CAG的WhenCondition属性代码解析
  15. [附源码]java毕业设计网上点餐系统
  16. 华为手机手机连电脑显示无法连接服务器,手机连接电脑用云服务器异常
  17. 场效应管调光电路图_一种LED驱动场效应管调光控制电路的制作方法
  18. ksy是谁_丽水KSY-B-400/100防雷模块是谁家的
  19. FPGA 之 SOPC 系列(四)NIOS II 外围设备--标准系统搭建
  20. python 酷炫效果_六种酷炫Python运行进度条效果的实现代码

热门文章

  1. 开源图神经网络框架DGL升级:GCMC训练时间从1天缩到1小时,RGCN实现速度提升291倍...
  2. 史上最大AI芯片诞生:462平方厘米、40万核心、1.2万亿晶体管,创下4项世界纪录...
  3. 每张脸值5美元,谷歌花钱买数据强化刷脸,还把隔空操控手机变成现实
  4. 【Thinkphp 5】 整合邮箱类 phpmailer实现邮件发送
  5. CFCC百套计划2 CodeChef December Challenge 2017 Chef And Easy Xor Queries
  6. [TFRecord文件格式]基本介绍
  7. nginc+memcache
  8. 速读《构建之法:现代软件工程》提问
  9. 技术网站 --人人都是产品经理
  10. NHibernate初学二之简单执行SQL及HQL、Linq