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,但不适用于poj using 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-;
inline int sgn(DB x){if(abs(x)<EPS)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); inline int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
}
inline LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxN=;
const int maxM=;
const int maxP=;
const int INF=<<; int N,M,P;
int p[maxN+];
int t[maxN+][maxM+];
int S,T,now,first[maxN+maxM*maxP+];
struct Tedge{int u,v,flow,cost,next;}edge[*(maxN+maxN*maxM*maxP+maxP*maxM)+]; 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,,-cost);} int head,tail,que[maxN+maxM*maxP+];
int vis[maxN+maxM*maxP+],dis[maxN+maxM*maxP+],fromedge[maxN+maxM*maxP+];
inline int SPFA()
{
int i;
re(i,,N+P*M+)vis[i]=,dis[i]=INF,fromedge[i]=-;
dis[que[]=S]=;
head=;tail=;
vis[S]=;
while(head!=tail)
{
int u=que[head++],v,flow,cost;if(head==T)head=;
vis[u]=;
for(i=first[u],v=edge[i].v,flow=edge[i].flow,cost=edge[i].cost;i!=-;i=edge[i].next,v=edge[i].v,flow=edge[i].flow,cost=edge[i].cost)
if(flow> && dis[u]+cost<dis[v])
{
dis[v]=dis[u]+cost;
fromedge[v]=i;
if(!vis[v])
{
vis[que[tail]=v]=;
if(dis[que[tail]]<dis[que[head]])swap(que[head],que[tail]);
tail++;if(tail==T)tail=;
}
}
}
return dis[T]!=INF;
}
inline void work(int &res)
{
int i,x=INF,y,a,b;
for(i=fromedge[T];i!=-;i=fromedge[edge[i].u])
{
upmin(x,edge[i].flow);
if(edge[i].u==S)y=edge[i].v,a=(y-)/P+,b=y%P+;
}
for(i=fromedge[T];i!=-;i=fromedge[edge[i].u])edge[i].flow-=x,edge[i^].flow+=x,res+=x*edge[i].cost;
re(i,,N)insert((a-)*P+b,P*M+i,,b*t[i][a]);
}
inline int mincostmaxflow()
{
int res=;
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,-);now=-;
re(i,,N)p[i]=gint(),P+=p[i];
re(i,,N)re(j,,M)t[i][j]=gint();
S=;T=P*M+N+;
re(i,,P*M)insert(S,i,,);
re(i,,N)insert(P*M+i,T,p[i],);
re(i,,N)re(j,,M)insert((j-)*P+,P*M+i,,t[i][j]);
cout<<mincostmaxflow()<<endl;
return ;
}

NOI2012 美食节的更多相关文章

  1. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  2. BZOJ 2879: [Noi2012]美食节 最小费用流 动态添边

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 324  Solved: 179[Submit][Status] ...

  3. BZOJ 2879: [Noi2012]美食节( 费用流 + 动态加边 )

    倒着做菜..然后考虑为当前的人做菜对后面的人的影响就可以了..要动态加边 --------------------------------------------------------------- ...

  4. P2050 [NOI2012]美食节

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

  5. 【BZOJ2879】[Noi2012]美食节 动态加边网络流

    [BZOJ2879][Noi2012]美食节 Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食 ...

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

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

  7. 2879: [Noi2012]美食节 - BZOJ

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

  8. BZOJ 2879 NOI2012美食节

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2879 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M ...

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

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

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

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

随机推荐

  1. AES的S-BOX构造

    利用GF(2^8)乘法逆元,以及矩阵运算,可以构造出AES的SBOX. 求乘法逆元的一般方法是利用扩展欧几里得定理,在这里我取了个巧. 因为我已经有了GF的指数表(见上一篇文),利用指数表可以轻易地构 ...

  2. Storm拓扑的并行度(parallelism)介绍

    Storm拓扑的并行度(parallelism)介绍 1.Storm分为3个主要实体,用于在Storm集群中运行拓扑        工作进程:Worker Process,也称为Worker      ...

  3. 给大家推荐一款代替Visio的在线作图工具ProcessOn

    过去作图的时候一直都是在用visio,每一次换了电脑使用都要重新安装,这大家都知道,最头疼的就是激活问题,曾经因为激活问题我“找遍了”正个互联网,最后还没找到...从08年开始到现在,visio用了这 ...

  4. Create a simple REST web service with Python--转载

    今日尝试用python建立一个restful服务. 原文地址:http://www.dreamsyssoft.com/python-scripting-tutorial/create-simple-r ...

  5. npm包管理工具

    # 从官方包仓库中查找forever包的信息 npm search forever # 查看forever包中package.json的信息 npm view forever # 下载,安装forev ...

  6. 【调试技巧】FireFox作为移动端的设置

    1.在地址栏输入“about:config”,按下回车进入设置菜单. 2.找到“general.useragent.override”,如果没有这一项,则点右键“新建”->“字符串”,输入这个字 ...

  7. android学习笔记---63-PopupWindow,泡泡窗口的实现

    转载http://blog.csdn.net/lidew521/article/details/8976627 PopupWindow是一个可以显示在当前Activity之上的浮动容器,PopupWi ...

  8. 冷门却使用的 javascript 技巧

    前端已经被玩儿坏了!像用近似乱码的 javascript 拼一个图形,并且能够正常执行等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬 ...

  9. Android学习笔记之viewholder

    在adapter中通过使用静态内部类(viewholder)缓存组件的引用来防止ListView刷新时重新LayoutInflater跟findViewById从而达到优化的目的.示例如下: @Ove ...

  10. (一)一个工作任务引起的乱战——c#中结构体与byte[]间相互转换

    一个工作任务涉及到c#与c++系统间的udp通信,处理了蛮长时间没有完成任务,但是期间接触到不少小知识点.本人是初接触c#,c++语言没有接触过.可能写的东西都很小儿科,暂且记录下来当工作日记把. 先 ...