NOI2012 美食节
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修车
![](/assets/blank.gif)
![](/assets/blank.gif)
#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 美食节相关推荐
- bzoj2879: [Noi2012]美食节
bzoj2879: [Noi2012]美食节 题意 有n(<=40)道菜,第i道菜被点了pi(∑p<=800)次;有m(<=100)个人,第i个人做第j道菜用时tij(<=10 ...
- 2879: [Noi2012]美食节
Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...
- [BZOJ2879] [Noi2012] 美食节 (费用流 动态加边)
Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...
- [NOI2012]美食节——费用流(带权二分图匹配)+动态加边
题目描述 小M发现,美食节共有n种不同的菜品.每次点餐,每个同学可以选择其中的一个菜品.总共有m个厨师来制作这些菜品.当所有的同学点餐结束后,菜品的制作任务就会分配给每个厨师.然后每个厨师就会同时开始 ...
- noi2012美食节
描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都很可 ...
- [NOI2012]美食节(费用流)
题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都 ...
- P2050 [NOI2012]美食节
传送门 看一眼,这不是修车原题吗? 把厨师拆成 $n*m$ 个点,第 $k$ 种菜连向第 $i$ 个厨师的第 $j$ 个点表示第 $i$ 个厨师倒数做的第 $j$ 个菜是 $k$ 可以发现厨师 $i$ ...
- 「BZOJ2879」[Noi2012]美食节
这道题就是 「BZOJ1070」[SCOI2007]修车 的加强版 如果一开始把全部边连上会T 优化的方法是只连用到过和下一次增广可能用到的边. 1 #include<bits/stdc++.h ...
- [NOI2012]美食节
题解: 很经典的网络流 对于每个厨师拆点分开统计 1倍 2倍 3倍 n(mp)^2 有点大 动态加边 即对于每个厨师有了i才会有i+1 不过好像还是有点卡常?? 代码: #include <bi ...
最新文章
- 前台特效(3) 编辑表格
- VTK:几何对象之Planes
- IDEA的十大快捷键
- 读书笔记 数据化营销
- KafkaConsumer源码解析
- SAP License:大陆SAP用户清单
- 老是原罪?技术圈为何不待见大龄企业家
- PySpark︱DataFrame操作指南:增/删/改/查/合并/统计与数据处理
- cmake install_CMAKE入门实战
- 玩机:解决小米手机锁屏忘记密码无法解锁
- Endnote X6大客户版破解版+新功能介绍+视频介绍
- 任正非谈管理--读书笔记
- ppt快速美化四步法
- WWF中Conditioned Activity Group的子Activity扩展CAG的WhenCondition属性代码解析
- [附源码]java毕业设计网上点餐系统
- 华为手机手机连电脑显示无法连接服务器,手机连接电脑用云服务器异常
- 场效应管调光电路图_一种LED驱动场效应管调光控制电路的制作方法
- ksy是谁_丽水KSY-B-400/100防雷模块是谁家的
- FPGA 之 SOPC 系列(四)NIOS II 外围设备--标准系统搭建
- python 酷炫效果_六种酷炫Python运行进度条效果的实现代码
热门文章
- 开源图神经网络框架DGL升级:GCMC训练时间从1天缩到1小时,RGCN实现速度提升291倍...
- 史上最大AI芯片诞生:462平方厘米、40万核心、1.2万亿晶体管,创下4项世界纪录...
- 每张脸值5美元,谷歌花钱买数据强化刷脸,还把隔空操控手机变成现实
- 【Thinkphp 5】 整合邮箱类 phpmailer实现邮件发送
- CFCC百套计划2 CodeChef December Challenge 2017 Chef And Easy Xor Queries
- [TFRecord文件格式]基本介绍
- nginc+memcache
- 速读《构建之法:现代软件工程》提问
- 技术网站 --人人都是产品经理
- NHibernate初学二之简单执行SQL及HQL、Linq