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

----------------------------------------------------------------------------------

#include<deque>
#include<cstdio>
#include<cctype>
#include<bitset>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
const int maxn = 109;
const int maxv = 1000;
const int INF = 0X3F3F3F3F;
 
int N, M, V, S, T, ans;
int cnt[maxn], Food[maxn], Time[maxn][maxn];
int d[maxv], Id[maxv];
bitset<maxv> inq;
deque<int> q;
 
inline int getint() {
char c = getchar();
for(; !isdigit(c); c = getchar());
int ret = 0;
for(; isdigit(c); c = getchar())
ret = ret * 10 + c - '0';
return ret;
}
 
struct edge {
int t, c, w;
edge *nxt, *rev;
} E[1000000], *pt = E, *Head[maxv], *p[maxv];
 
inline void Add(int u, int v, int c, int w) {
pt->t = v, pt->c = c, pt->w = w;
pt->nxt = Head[u], Head[u] = pt++;
}
 
inline void AddEdge(int u, int v, int c, int w) {
Add(u, v, c, w), Add(v, u, 0, -w);
Head[u]->rev = Head[v];
Head[v]->rev = Head[u];
}
 
void Init() {
memset(Id, -1, sizeof Id);
V = 0, S = V++, T = V++;
N = getint(), M = getint();
for(int i = 0; i < N; i++)
AddEdge(S, Food[i] = V++, getint(), 0);
for(int i = 0; i < N; i++)
for(int j = 0; j < M; j++)
Time[i][j] = getint();
for(int i = 0; i < M; i++) {
for(int j = 0; j < N; j++)
AddEdge(Food[j], V, 1, Time[j][i]);
Id[V] = i;
AddEdge(V++, T, 1, 0);
cnt[i] = 1;
}
ans = 0;
}
 
bool Aug() {
memset(d, INF, sizeof(int) * V);
inq.reset();
d[S] = 0;
q.push_front(S);
while(!q.empty()) {
int x = q.front(); q.pop_front();
inq[x] = 0;
for(edge* e = Head[x]; e; e = e->nxt) if(e->c && d[e->t] > d[x] + e->w) {
d[e->t] = d[x] + e->w;
p[e->t] = e;
if(!inq[e->t]) {
inq[e->t] = 1;
if(!q.empty() && d[e->t] < d[q.front()])
q.push_front(e->t);
else
q.push_back(e->t);
}
}
}
if(d[T] == INF) return false;
ans += d[T];
for(int x = T; x != S; x = p[x]->rev->t) {
p[x]->c--;
p[x]->rev->c++;
}
return true;
}
void Work() {
while(Aug()) {
int x = T;
for(; !~Id[x]; x = p[x]->rev->t);
cnt[Id[x]]++;
for(int i = 0; i < N; i++) 
AddEdge(Food[i], V, 1, cnt[Id[x]] * Time[i][Id[x]]);
Id[V] = Id[x];
AddEdge(V++, T, 1, 0);
}
printf("%d\n", ans);
}
 
int main() {
Init();
Work();
return 0;
}

----------------------------------------------------------------------------------

2879: [Noi2012]美食节

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 1257  Solved: 675
[Submit][Status][Discuss]

Description

CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节。作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴。他很快就尝遍了美食节所有的美食。然而,尝鲜的欲望是难以满足的。尽管所有的菜品都很可口,厨师做菜的速度也很快,小M仍然觉得自己桌上没有已经摆在别人餐桌上的美食是一件无法忍受的事情。于是小M开始研究起了做菜顺序的问题,即安排一个做菜的顺序使得同学们的等待时间最短。小M发现,美食节共有n种不同的菜品。每次点餐,每个同学可以选择其中的一个菜品。总共有m个厨师来制作这些菜品。当所有的同学点餐结束后,菜品的制作任务就会分配给每个厨师。然后每个厨师就会同时开始做菜。厨师们会按照要求的顺序进行制作,并且每次只能制作一人份。此外,小M还发现了另一件有意思的事情: 虽然这m个厨师都会制作全部的n种菜品,但对于同一菜品,不同厨师的制作时间未必相同。他将菜品用1, 2, ..., n依次编号,厨师用1, 2, ..., m依次编号,将第j个厨师制作第i种菜品的时间记为 ti,j 。小M认为:每个同学的等待时间为所有厨师开始做菜起,到自己那份菜品完成为止的时间总长度。换句话说,如果一个同学点的菜是某个厨师做的第k道菜,则他的等待时间就是这个厨师制作前k道菜的时间之和。而总等待时间为所有同学的等待时间之和。现在,小M找到了所有同学的点菜信息: 有 pi 个同学点了第i种菜品(i=1, 2, ..., n)。他想知道的是最小的总等待时间是多少。

Input

输入文件的第1行包含两个正整数n和m,表示菜品的种数和厨师的数量。 第2行包含n个正整数,其中第i个数为pi,表示点第i种菜品的人数。 接下来有n行,每行包含m个非负整数,这n行中的第i行的第j个数为ti,j,表示第j个厨师制作第i种菜品所需的时间。 输入文件中每行相邻的两个数之间均由一个空格隔开,行末均没有多余空格。

Output

输出仅一行包含一个整数,为总等待时间的最小值。

Sample Input

3 2
3 1 1
5 7
3 6
8 9

Sample Output

47

【样例说明】
厨师1先制作1份菜品2,再制作2份菜品1。点这3道菜的3个同学的等待时间分别为3,3+5=8,3+5+5=13。
厨师2先制作1份菜品1,再制作1份菜品3。点这2道菜的2个同学的等待时间分别为7,7+9=16。
总等待时间为3+8+13+7+16=47。
虽然菜品1和菜品3由厨师1制作更快,如果这些菜品都由厨师1制作,总等待时间反而更长。如果按上述的做法,将1份菜品1和1份菜品3调整到厨师2制作,这样厨师2不会闲着,总等待时间更短。
可以证明,没有更优的点餐方案。

【数据规模及约定】
对于100%的数据,n <= 40, m <= 100, p <= 800, ti,j <= 1000(其中p = ∑pi,即点菜同学的总人数)。
每组数据的n、m和p值如下:
测试点编号 n m p
1 n = 5 m = 5 p = 10
2 n = 40 m = 1 p = 400
3 n = 40 m = 2 p = 300
4 n = 40 m = 40 p = 40
5 n = 5 m = 40 p = 100
6 n = 10 m = 50 p = 200
7 n = 20 m = 60 p = 400
8 n = 40 m = 80 p = 600
9 n = 40 m = 100 p = 800
10 n = 40 m = 100 p = 800

HINT

Source

BZOJ 2879: [Noi2012]美食节( 费用流 + 动态加边 )的更多相关文章

  1. BZOJ 2879 [Noi2012]美食节 | 费用流 动态开点

    这道题就是"修车"的数据加强版--但是数据范围扩大了好多,应对方法是"动态开点". 首先先把"所有厨师做的倒数第一道菜"和所有菜连边,然后跑 ...

  2. 【bzoj2879】[Noi2012]美食节 费用流+动态加边

    原文地址:http://www.cnblogs.com/GXZlegend 题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他 ...

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

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

  4. BZOJ.2879.[NOI2012]美食节(费用流SPFA)

    题目链接 /* 同"修车":对于每个厨师拆成p个点表示p个时间点,每个人向m个厨师每个时间点连边 这样边数O(nmp)+网络流 ≈O(nm*p^2)(假设SPFA线性) = GG ...

  5. [NOI2012][bzoj2879] 美食节 [费用流+动态加边]

    题面 传送门 思路 先看看这道题 修车 仔细理解一下,这两道题是不是一样的? 这道题的不同之处 但是有一个区别:本题中每一种车有多个需求,但是这个好办,连边的时候容量涨成$p\lbrack i\rbr ...

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

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

  7. BZOJ 2879: [Noi2012]美食节

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

  8. BZOJ 2879 美食节(费用流-动态加边)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2879 题意:有n道菜,每道菜需要b[i]份,m个厨师,第j个厨师做第i道菜需要时间a[i ...

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

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

随机推荐

  1. UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索

    题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...

  2. Java学习笔记---继承和super的用法

    自从换了个视频教学,感觉比原来那个好多了,就是学校网速太渣,好多视频看一会卡半天,只能先看看已经下载的了. 不过也好,虽然不能从开始开始重新开,但是已经看过一次,在看一次也是好的,就当巩固学习了. 继 ...

  3. 【转】SQL Server查询字段说明

    select c .name, isnull(ETP .value, '') as Des FROM syscolumns c inner join systypes t on c. xusertyp ...

  4. Linux下Oracle常见安装错误[Z]

    #./runInstaller之后出现如下的错误信息: RedHat AS5 x86上安装Oracle1020 Exception in thread "main" java.la ...

  5. Lua的元方法__newindex元方法

    上一篇介绍了__index元方法,总结来说:__index元方法是用于处理访问table中不存在的字段时的情况. 而今天,介绍的__newindex元方法,总结来说,就是:用于处理给table中不存在 ...

  6. OC语法8——@class关键字

    @class关键字: 在当前类中若要引用其他类的对象作成员变量(Book  *book),我们以前采用的方式是 #import "Book.h" 但 #import "B ...

  7. 管理node_modules

    http://stackoverflow.com/questions/15225865/centralise-node-modules-in-project-with-subproject

  8. Storm基础理论

    Storm流式计算基础 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB" ...

  9. Windows系统环境下一个Apache运行多个PHP版本

    我个人机器上环境是基于Apache2.2运行的PHP5.2/4,如你想部署其他版本的PHP或在更多的版本之间切换,同理操作步骤是一致的. 依本人环境为例,机器上已经安装了PHP5.2版本, 所以首先重 ...

  10. Struts2部分标签

    由于Struts多用OGNL语言所以使用给类标签之前需引入<%@taglib prefix="s" uri="/struts-tags"%> 1.f ...