P2050 [NOI2012]美食节 动态加边加点
修车数据加强版 需要动态加边加点
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x7f7f7f7f;
const int MAXN = , MAXM = ;
int Head[MAXN], cur[MAXN], lev[MAXN], to[MAXM << ], nxt[MAXM << ], f[MAXM << ], mono[MAXM << ], ed = , S, T;
int pre[MAXN];
int t[][];
int n, m, sum, now;
bool exist[MAXN];
void addedge(int u, int v, int cap, int val) {
to[++ed] = v;
nxt[ed] = Head[u];
Head[u] = ed;
f[ed] = cap;
mono[ed] = val;
to[++ed] = u;
nxt[ed] = Head[v];
Head[v] = ed;
f[ed] = ;
mono[ed] = - * val;
return;
}
bool BFS() {
int u;
queue<int>q;
memset(exist, false, sizeof(exist));
memset(lev, , sizeof(lev));
lev[S] = pre[S] = ;
q.push(S);
while (q.size()) {
u = q.front();
q.pop();
exist[u] = false;
for (int i = Head[u]; i; i = nxt[i])
if (f[i] && lev[u] + mono[i] < lev[to[i]]) {
lev[to[i]] = lev[u] + mono[i];
pre[to[i]] = i;
if (!exist[to[i]]) {
exist[to[i]] = true;
q.push(to[i]);
}
}
}
memcpy(cur, Head, sizeof(Head));
return lev[T] != INF;
}
int DFS(int u, int maxf) {
if (u == T || !maxf) {
return maxf;
}
exist[u] = true;
int cnt = ;
for (int &i = cur[u], tem; i; i = nxt[i])
if (f[i] && lev[u] + mono[i] == lev[to[i]]) {
if (exist[to[i]]) {
continue;
}
tem = DFS(to[i], min(f[i], maxf));
maxf -= tem;
f[i] -= tem;
f[i ^ ] += tem;
cnt += tem;
if (!maxf) {
break;
}
}
if (!cnt) {
lev[u] = - * INF;
}
exist[u] = false;
return cnt;
}
int Augment() {
int delta = INF;
for (int i = pre[T]; i; i = pre[to[i ^ ]])
if (f[i] < delta) {
delta = f[i];
}
for (int i = pre[T]; i; i = pre[to[i ^ ]]) {
f[i] -= delta;
f[i ^ ] += delta;
}
return delta * lev[T];
}
int MCMF() {
int ans = ;
memset(exist, false, sizeof(exist));
while (BFS())
//ans+=DFS(S,INF)*lev[T];
{
int j = to[pre[T] ^ ];
addedge(j + , T, , );
j++;
for (int i = ; i <= n; i++) {
int x = (j - n - ) / sum + ;
int y = j - n - (x - ) * sum;
addedge(i, j, , y * t[x][i]);
}
ans += Augment();
}
return ans;
}
int main() {
sum = ;
scanf("%d %d", &n, &m);
S = ;
for (int i = ; i <= n; i++) {
scanf("%d", &now);
sum += now;
addedge(S, i, now, );
}
T = n + sum * m + ;
for (int i = n + ; i <= T - ; i += sum) {
addedge(i, T, , );
}
for (int i = ; i <= n; i++) {
for (int j = ; j <= m; j++) {
scanf("%d", &t[j][i]);
}
}
for (int i = ; i <= n; i++) {
for (int j = n + ; j <= T - ; j += sum) {
int x = (j - n - ) / sum + ;
int y = j - n - (x - ) * sum;
addedge(i, j, , y * t[x][i]);
}
}
int ans = MCMF();
cout << ans << endl;
return ;
}
P2050 [NOI2012]美食节 动态加边加点的更多相关文章
- 【BZOJ2879】[Noi2012]美食节 动态加边网络流
[BZOJ2879][Noi2012]美食节 Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食 ...
- P2050 [NOI2012]美食节 动态连边优化费用流
题意 类似的一道排队等候,算最小总等待时间的题目. 思路 但是这道题的边数很多,直接跑会tle,可以动态加边,就是先连上倒数第一次操作的边,跑一遍费用流,然后对使用了倒数第一条边的点,连上相应的倒数第 ...
- P2050 [NOI2012]美食节(费用流)
P2050 [NOI2012]美食节 P2053 [SCOI2007]修车的加强版 因为数据较大,一次性把所有边都加完会T 于是我们每次只连需要的边跑费用流 就是开始先连所有厨师做倒数第1道菜 跑费用 ...
- P2050 [NOI2012]美食节
题目地址:P2050 [NOI2012]美食节 先来讲一下P2053 [SCOI2007]修车(如果会做请跳过) 同一时刻有 \(N\) 位车主带着他们的爱车来到了汽车维修中心.维修中心共有 \(M\ ...
- 洛谷P2050 [NOI2012]美食节
动态加边网络流 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring ...
- 洛谷$P2050\ [NOI2012]$美食节 网络流
正解:网络流 解题报告: 传送门$QwQ$ 昂开始看到$jio$得,哇长得好像上一题嗷$QwQ$ 然后仔细康康数据范围,发现,哇好像要几万个点,,,显然就$GG$了 但感$jio$思路方向好对的亚子? ...
- BZOJ 2879: [Noi2012]美食节( 费用流 + 动态加边 )
倒着做菜..然后考虑为当前的人做菜对后面的人的影响就可以了..要动态加边 --------------------------------------------------------------- ...
- 【bzoj2879】[Noi2012]美食节 费用流+动态加边
原文地址:http://www.cnblogs.com/GXZlegend 题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他 ...
- [BZOJ2879] [Noi2012] 美食节 (费用流 & 动态加边)
Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...
随机推荐
- 【ARM-Linux开发】wayland和weston的介绍
简单地说,Wayland是一套display server(Wayland compositor)与client间的通信协议,而Weston是Wayland compositor的参考实现.其官网为h ...
- 【编程开发】opencv实现对Mat中某一列或某一行的元素进行normalization
[编程开发]opencv实现对Mat中某一列或某一行的元素进行normalization 标签: [编程开发] [机器学习] 声明:引用请注明出处http://blog.csdn.net/lg1259 ...
- Java学习笔记-包装类
基本数据类型对象包装类的最常见作用,就是用于基本数据类型和字符串类型之间做转换 包装类的由来 为了解决8种基本数据类型的变量不能当成Object类型变量使用的问题,Java提供了包装类(Wrapper ...
- C#实现工作日和休息日(包括法定节假日)的计算
转自:http://www.cnblogs.com/yuan-chong/p/HolidayHelper.html 一.开发背景: 最近在公司开发的系统中,需要计算工作日,就是给出一个采购周期(n天) ...
- $.ajax 中的contentType类型
参考链接:https://www.jianshu.com/p/f4d92b3d387d
- 2019牛客多校赛第一场 补题 I题
I题 Points Division 题意: 给你n个点,每个点有坐标(xi,yi)和属性(ai,bi),将点集划分为两个集合, 任意 A 集合的点 i 和 B 集合点 j, 不允许 xi > ...
- [CF1010D]Mars Over_位运算性质
Mars rover 题目链接:http://codeforces.com/problemset/problem/1010/D 数据范围:略. 题解: 因为每次只改一个,改完之后改回去,这个性质很重要 ...
- celery异步任务
1.安装 pip install celery 2.创建celery_tasks文件夹,创建config配置文件和main文件 # 在config.py文件中配置中间人broker地址信息 - red ...
- spark调优篇-spark on yarn web UI
spark on yarn 的执行过程在 yarn RM 上无法直接查看,即 http://192.168.10.10:8088,这对于调试程序很不方便,所以需要手动配置 配置方法 1. 配置 spa ...
- 以太坊再爆高危漏洞!黑客增发ATN 1100万枚token事件始末
事情发生在5月中旬,ATN技术人员发现Token合约由于存在漏洞受到攻击.不过ATN基金会随后透露,将销毁1100万个ATN,并恢复ATN总量,同时将在主链上线映射时对黑客地址内的资产予以剔除,确保原 ...