美食节

题解:学习了动态加边,可以说是进一步理解了网络流。具体思路就是考虑每一道菜,如果这是该位厨师最后一次做,那么等待时间就是做这道菜的时间,如果是倒数第二次做,就要两倍时间(目前做了一次,后面还有等待的一次时间)……,对于其他菜以此类推。那么可以这样考虑,当这位厨师倒一次做的边没有流量的时候,是不可能用到倒二次做的边(因为费用流会优先选择费用小的边,而我们的时间花费即为费用,故倒一次没用不可能使用倒二次),于是乎可以在跑完每次最短路的时候,判断这次是从哪个厨师的哪个点转移来的,紧接着连上接下来的一个点(倒一就连倒二,倒二就倒三……)。

#pragma comment(linker, "/STACK: 1024000000,1024000000")
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define eb emplace_back
#define em emplace
#define pii pair<int,int>
#define de(x) cout << #x << " = " << x << endl
#define clr(a,b) memset(a,b,sizeof(a))
#define INF (0x3f3f3f3f)
#define LINF ((long long)(0x3f3f3f3f3f3f3f3f))
#define F first
#define S second
using namespace std;
inline int getint()
{
int _x=0; char _tc=getchar();
while(_tc<'0'||_tc>'9') _tc=getchar();
while(_tc>='0'&&_tc<='9') _x*=10,_x+=(_tc-'0'),_tc=getchar();
return _x;
} const int M = 1e5 + 15;
const int N = 110;
int T[N][N];
int p[N], P;
int n, m, st, ed;
struct Edge
{
int u, v, c, w, nxt;
Edge(){}
Edge( int t2, int t3, int t4, int t5, int t6 ) :
u(t2), v(t3), c(t4), w(t5), nxt(t6) {}
};
Edge e[M<<4];
int ect;
int pr[M], h[M], d[M];
bool vis[M];
int ans = 0; void _add( int u, int v, int c, int w )
{
e[ect].u = u; e[ect].v = v; e[ect].c = c; e[ect].w = w; e[ect].nxt = h[u]; h[u] = ect ++;
e[ect].u = v; e[ect].v = u; e[ect].c = 0; e[ect].w = -w; e[ect].nxt = h[v]; h[v] = ect ++;
} void init()
{
clr(h,-1);
P = ect = 0;
}
bool spfa()
{
clr(d,INF);
clr(vis,false);
clr(pr,-1);
queue<int> Q;
Q.push( st );
d[st] = 0;
vis[st] = true;
while ( !Q.empty() )
{
int u = Q.front(); Q.pop();
vis[u] = false;
for ( int i = h[u]; i + 1; i = e[i].nxt )
{
int v = e[i].v;
if ( e[i].c > 0 && d[v] > d[u] + e[i].w )
{
d[v] = d[u] + e[i].w;
pr[v] = i;
if ( !vis[v] )
{
vis[v] = true;
Q.push(v);
}
}
}
}
return d[ed] != INF;
} void mcf()
{
int f = INF;
for ( int i = ed; i != st; i = e[pr[i]].u )
f = min( f, e[pr[i]].c );
for ( int i = ed; i != st; i = e[pr[i]].u )
{
e[pr[i]].c -= f, e[pr[i]^1].c += f;
ans += f*e[pr[i]].w;
}
int x = e[pr[ed]].u;
int nw = (x-n-1)/P + 1, th = (x-n)%P + 1;
if ( th <= P )
{
for ( int i = 1; i <= n; i ++ )
_add( i, n+(nw-1)*P+th, 1, th*T[i][nw] );
}
_add( n+(nw-1)*P+th, ed, 1, 0 );
} int main()
{
init();
scanf("%d%d", &n, &m);
for ( int i = 1; i <= n; i ++ )
scanf("%d", &p[i]), P += p[i];
for ( int i = 1; i <= n; i ++ )
for ( int j = 1; j <= m; j ++ )
scanf("%d", &T[i][j]);
st = 0, ed = n + 1 + P*m;
for ( int i = 1; i <= n; i ++ )
{
_add( st, i, p[i], 0 );
for ( int j = 1; j <= m; j ++ )
_add( i, n+(j-1)*P+1, 1, T[i][j] );
}
for ( int i = 1; i <= m; i ++ )
_add( n+(i-1)*P+1, ed, 1, 0 );
while ( spfa() ) mcf();
printf("%d\n", ans);
return 0;
}

G_M_C_美食节的更多相关文章

  1. BZOJ 2879: [Noi2012]美食节

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

  2. C++之路进阶——bzoj2879(美食节)

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

  3. 【BZOJ-2879】美食节 最小费用最大流 + 动态建图

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

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

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

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

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

  6. BZOJ 2879 NOI2012美食节

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

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

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

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

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

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

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

随机推荐

  1. Java 去除List列表中的重复项

    /** * Remove list duplicate item * * @param srcList * @return */ private static ArrayList<Resolve ...

  2. 以吃货的角度去理解云计算中On-Premise、IaaS、PaaS和SaaS

    了解云计算的一定都听过四个“高大上”的概念:On-Premise(本地部署),IaaS(基础设施及服务).PaaS(平台即服务)和SaaS(软件即服务),这几个术语并不好理解.不过,如果你是个吃货,还 ...

  3. 【BZOJ2554】Color 概率神题

    [BZOJ2554]Color Description 有n个球排成一列,每个球都有一个颜色,用A-Z的大写字母来表示,我们每次随机选出两个球ball1,ball2,使得后者染上前者的颜色,求期望操作 ...

  4. 【BZOJ5109】[CodePlus 2017]大吉大利,晚上吃鸡! 最短路+拓扑排序+DP

    [BZOJ5109][CodePlus 2017]大吉大利,晚上吃鸡! Description 最近<绝地求生:大逃杀>风靡全球,皮皮和毛毛也迷上了这款游戏,他们经常组队玩这款游戏.在游戏 ...

  5. 微信小程序 --- 绘画

    cavans及context详解 绘画API的使用 游戏的制作

  6. vscode 中使用 csscomb

    我看中 csscomb 主要是用来给 css 属性排序用的,当然他也有格式化的作用: 1.安装不必说,但是装了之后,默认似乎没用: 2.点开 文件-首选项,搜下 csscomb 就知道了: 3.第一个 ...

  7. 了解MIP(Mobile Instant Pages)

    mip官网:https://www.mipengine.org/   什么是mip? mip是百度在2016年提出的移动网页加速器项目.可以简单理解为是一个规范.   mip能做什么? mip能帮助站 ...

  8. 向Docx4j生成的word文档添加图片和布局--第一部分

    原文标题:Adding images and layout to your Docx4j-generated word documents, part 1 原文链接:http://blog.iprof ...

  9. rac下asm管理的表空间-数据文件的重命名

    asm下表空间的重命名与普通文件系统下的表空间重命名原理是一样的,只不过asm管理的数据文件有一些需要注意的地方,另外在asm下操作数据文件需要格外小心,稍有不慎将会造成数据文件丢失,如可以做备份最好 ...

  10. python 的 ord()、 chr()、 unichr() 函数

    一. ord() 函数描述ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返 ...