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自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...
随机推荐
- Hadoop入门学习笔记之一
http://hadoop.apache.org/docs/r1.2.1/api/index.html 适当的利用 null 在map中可以实现对文件的简单处理,如排序,和分集合输出等. 需要关心的内 ...
- 在java web 工程中实现登录和安全验证
登录验证代码 package security; import java.io.IOException; import javax.servlet.ServletException; import j ...
- CQRS1
CQRS之旅——旅程1(我们的领域:Contoso会议管理系统) 旅程1:我们的领域:Contoso会议管理系统 起点:我们从哪里来,我们带来了什么,谁将与我们同行?“ 只要前进,我愿意去任何地方 ...
- gx_dlms 的杂乱记录
DLMS_ERROR_CODE_FALSE W3Jehpnc543MuwUz6ZWDshy5kwbbE9Cw CGXDLMSClient::GetData(CGXByteBuffer& rep ...
- PTA(Advanced Level)1041.Be Unique
Being unique is so important to people on Mars that even their lottery is designed in a unique way. ...
- HanLP-基于HMM-Viterbi的人名识别原理介绍
Hanlp自然语言处理包中的基于HMM-Viterbi处理人名识别的内容大概在年初的有分享过这类的文章,时间稍微久了一点,有点忘记了.看了 baiziyu 分享的这篇比我之前分享的要简单明了的多.下面 ...
- linux内核exec过程
简介 本文分析linux内核exec系统调用执行过程中可执行文件的加载过程和栈的设置,内核代码版本为2.6.32 分析 \arch\ia64\kernel\process.c中有sys_exec函数的 ...
- varnish 子程序流程
VCL中主要动作: pass:当一个请求被pass后,这个请求将通过varnish转发到后端服务器,该请求不会被缓存,后续的请求仍然通过Varnish处理.pass可以放在vcl_recv 和vcl_ ...
- 牛客 197C 期望操作数
大意: 给定$x,q$, 每步操作$x$等概率变为$[x,q]$中任意一个数, 求变为$q$的期望操作数. 很容易可以得到$f(x,q)=\frac{\sum\limits_{i=x+1}^qf(i, ...
- Java 并发进阶常见面试题总结
声明:本文内容完全来自网络,转自GitHub->JavaGuide(https://github.com/Snailclimb/JavaGuide),致谢 1. synchronize ...