/**************************************************************
Problem: 3876
User: wangck1998
Language: C++
Result: Accepted
Time:176 ms
Memory:1456 kb
****************************************************************/ #include <bits/stdc++.h>
using namespace std; #ifdef debug
#define ep(...) fprintf(stderr, __VA_ARGS__)
#else
#define ep(...) assert(true)
#endif const int MAXN = 303;
const int INF = 0x3f3f3f3f; const int MAXV = MAXN + 3;
const int MAXE = (5003 + MAXN * 2) * 2; struct Edge {
Edge* next;
int dest;
int cap;
int val;
}; Edge memory[MAXE];
Edge* curMemory = memory;
Edge* info[MAXV]; void insert(int u, int v, int c, int l) {
curMemory->next = info[u];
curMemory->dest = v;
curMemory->cap = c;
curMemory->val = l;
info[u] = curMemory++; curMemory->next = info[v];
curMemory->dest = u;
curMemory->cap = 0;
curMemory->val = -l;
info[v] = curMemory++;
} Edge* oppsiteEdge(const Edge* const x) {
return memory + ((x - memory) ^ 1);
} int n;
int S, T; int d[MAXV];
bool vis[MAXV];
int slack[MAXV];
Edge* pre[MAXV]; int dfs(int u, int flow) {
if (u == T) return flow;
vis[u] = true;
int rest = flow;
for (Edge* &pt = pre[u]; pt; pt = pt->next) {
int v = pt->dest;
if (pt->cap) {
if (d[u] + pt->val == d[v] && ! vis[v]) {
int temp = dfs(v, min(rest, pt->cap));
if (temp) {
rest -= temp;
pt->cap -= temp;
oppsiteEdge(pt)->cap += temp;
if (rest == 0) return flow;
}
}
else slack[v] = min(slack[v], d[u] + pt->val - d[v]);
}
}
return flow - rest;
} int maxFlow() {
fill(d, d + T + 1, INF);
d[S] = 0;
queue<int> que;
que.push(S);
do {
int u = que.front();
que.pop();
for (Edge* pt = info[u]; pt; pt = pt->next)
if (pt->cap) {
int v = pt->dest;
int temp = d[u] + pt->val;
if (temp < d[v]) {
d[v] = temp;
que.push(v);
}
}
}while (! que.empty()); int ret = 0;
while (1) {
while (1) {
fill(vis, vis + T + 1, false);
fill(slack, slack + T + 1, INF);
copy(info, info + T + 1, pre);
int temp = dfs(S, INF);
if (temp) ret += (d[T] - d[S]) * temp;
else break;
} int temp = INF;
for (int i = 0; i <= T; i++)
if (! vis[i]) temp = min(temp, slack[i]);
if (temp == INF) break;
for (int i = 0; i <= T; i++)
if (vis[i]) d[i] -= temp;
}
return ret;
} int main() {
scanf("%d", &n);
S = 0, T = n + 1; int ans = 0;
static int degree[MAXN];
for (int i = 1; i <= n; i ++) {
int m;
scanf("%d", &m);
degree[i] -= m;
for (int j = 0; j < m; j ++) {
int v, c;
scanf("%d%d", &v, &c);
degree[v] ++;
insert(i, v, INF, c);
ans += c;
}
} for (int i = 1; i <= n; i ++) {
if (degree[i] > 0) {
insert(S, i, degree[i], 0);
}
else if (degree[i] < 0) {
insert(i, T, - degree[i], 0);
}
insert(i, 1, INF, 0);
} printf("%d\n", ans + maxFlow()); return 0;
}

zkw费用流模版的更多相关文章

  1. zkw费用流+当前弧优化

    zkw费用流+当前弧优化 var o,v:..] of boolean; f,s,d,dis:..] of longint; next,p,c,w:..] of longint; i,j,k,l,y, ...

  2. 学习了ZKW费用流

    所谓ZKW费用流,其实就是Dinic. 若干年前有一个人发明了最小增广路算法,每次用BFS找一条增广路,时间O(nm^2) 然后被DinicD飞了:我们为什么不可以在长度不变时多路增广呢?时间O(n^ ...

  3. zkw费用流

    期末结束,竞赛生活继续开始,先怒刷完寒假作业再说 至于期末考试,数学跪惨,各种哦智障错,还有我初中常用的建系大法居然被自己抛至脑后,看来学的还是不扎实,以后数学要老老实实学.物理被永哥黑了两分,然后很 ...

  4. 【zkw费用流】[网络流24题]餐巾计划问题

    题目描述 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. (1)购买新的餐巾,每块需p分: (2)把用过的餐巾送到快洗部,洗一块需m天,费用需f分(f ...

  5. CSU 1948: 超级管理员(普通费用流&&zkw费用流)

    Description 长者对小明施加了膜法,使得小明每天起床就像马丁的早晨一样. 今天小明早上醒来发现自己成了一位仓管员.仓库可以被描述为一个n × m的网格,在每个网格上有几个箱子(可能没有).为 ...

  6. BZOJ2673 [Wf2011]Chips Challenge 费用流 zkw费用流 网络流

    https://darkbzoj.cf/problem/2673 有一个芯片,芯片上有N*N(1≤N≤40)个插槽,可以在里面装零件. 有些插槽不能装零件,有些插槽必须装零件,剩下的插槽随意. 要求装 ...

  7. 图论-zkw费用流

    图论-zkw费用流 模板 这是一个求最小费用最大流的算法,因为发明者是神仙zkw,所以叫zkw费用流(就是zkw线段树那个zkw).有些时候比EK快,有些时候慢一些,没有比普通费用流算法更难,所以学z ...

  8. zkw费用流 学习笔记

    分析 记\(D_i\)为从\(S\)出发到\(i\)的最短路 最短路算法保证, 算法结束时 对于任意存在弧\((i,j)\)满足\(D_i + c_{ij}\ge D_j\) ① 且对于每个 \(j\ ...

  9. P4015 运输问题【zkw费用流】

    输入输出样例 输入 #1复制 2 3 220 280 170 120 210 77 39 105 150 186 122 输出 #1复制 48500 69140zuixiaofeiyo 说明/提示 1 ...

随机推荐

  1. HDU1506 ( Largest Rectangle in a Histogram ) [dp]

    近期情绪太不稳定了.可能是由于在找实习这个过程碰壁了吧.第一次面试就跪了,可能是我面的是一个新公司,制度不完好,我感觉整个面试过程全然不沾编程,我面试的还是软件开发-后来我同学面试的时候.说是有一道数 ...

  2. Android UI设计

    Android UI设计--PopupWindow显示位置设置 摘要: 当点击某个按钮并弹出PopupWindow时,PopupWindow左下角默认与按钮对齐,但是如果PopupWindow是下图的 ...

  3. 保存android程序崩溃日志到SD卡

    private boolean writeToSDCard(Throwable ex) { boolean isDealing = false; if (Environment.getExternal ...

  4. VS的工程宏,比如$(SolutionDir) 的含义及查找

    Configuration->General->Output Directory->单击编辑框点下拉箭头-> <Edit...> 图1 图2

  5. 驴吃胡萝卜问题——牛客/FEI

    一个商人骑一头驴要穿越1000公里长的沙漠,去卖3000根胡萝卜.已知驴一次性可驮1000根胡萝卜,但每走1公里又要吃掉1根胡萝卜.问:商人最多可卖出多少胡萝卜? 一个商人骑一头驴要穿越1000公里长 ...

  6. c++ primer plus 习题答案(3)

    p296.3 #include<iostream> #include<cstdlib> #include<string> #include<cstring&g ...

  7. A Byte of Python 笔记(6)模块

    第8章 模块 用户在程序中定义一次函数而重用代码,如果用户想在其他程序中重用很多函数,可以通过使用模块的方式. 模块就是一个包含了所有用户定义的函数和变量的文件.为了在其他程序中重用模块,模块的文件名 ...

  8. Python collections.defaultdict 笔记

    其实defaultdict 就是一个字典,只不过python自动的为它的键赋了一个初始值.这也就是说,你不显示的为字典的键赋初值python不会报错,看下实际例子. 比如你想计算频率 frequenc ...

  9. 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本、内核、当前时间

    申请博客有一段时间了,然而到现在还一篇没有写过..... 主要因为没有想到需要写些什么,最近在学习Python语言,照着书上看了看最基础的东西,发现根本看不进去,而且光看的话今天看了觉得都理解懂了,过 ...

  10. 高质量程序设计指南C/C++语言——内存管理

    • free()和delete只是把指针所指的内容给释放掉,并没有把指针本身删掉.指针被free()或delete以后其地址仍然不变(不等于NULL),只是该地址对应的内存是垃圾——p成了野指针.如果 ...