一下代码版权归:HIT    xiaodai

最大流模板:(题目链接)

#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
#define N 1200
#define M 50220
#define INF 0x3f3f3f3fclass MaxFlow {
public:struct record {int v, f, next;} edge[M];int n, s, t;int pos[N], dis[N], vh[N], cl;int his[N], di[N], pre[N];void AddEdge(int a, int b, int f) {cl++;edge[cl].next = pos[a];edge[cl].v = b;edge[cl].f = f;pos[a] = cl;cl++;edge[cl].next = pos[b];edge[cl].v = a;edge[cl].f = 0; //若为无向边,则f = fpos[b] = cl;}void Init() {cl = 1;memset(dis, 0, sizeof(dis));memset(vh, 0, sizeof(vh));memset(pos, 0, sizeof(pos));}int flow() {vh[0] = n; //初始化GAP数组(默认所有点的距离标号均为0,则距离标号为0的点数量为n)for (int i = 0; i < n; i++) di[i] = pos[i]; //初始化当前弧int i = s, aug = INF, flow = 0; //初始化一些变量,flow为全局流量,aug为当前增广路的流量bool flag = false; //标记变量,记录是否找到了一条增广路(若没有找到则修正距离标号)while (dis[s] < n) {his[i] = aug; //保存当前流量flag = false;for (int p=di[i]; p; p=edge[p].next)if ((edge[p].f > 0) && (dis[edge[p].v] + 1 == dis[i])) {//利用距离标号判定可行弧flag = true; //发现可行弧di[i] = p; //更新当前弧aug = min(aug, edge[p].f); //更新当前流量pre[edge[p].v] = p; //记录前驱结点i = edge[p].v; //在弧上向前滑动if (i == t) {//遇到汇点,发现可增广路flow += aug; //更新全局流量while (i != s) {//减少增广路上相应弧的容量,并增加其反向边容量edge[pre[i]].f -= aug;edge[pre[i]^1].f += aug;i = edge[pre[i]^1].v;}aug = INF;}break;}if (flag) continue; //若发现可行弧则继续,否则更新标号int min = n - 1;for (int p=pos[i]; p; p=edge[p].next)if ((edge[p].f > 0) && (dis[edge[p].v] < min)) {di[i] = p; //不要忘了重置当前弧min = dis[edge[p].v];}--vh[dis[i]];if (vh[dis[i]] == 0) break; //更新vh数组,若发现距离断层,则算法结束(GAP优化)dis[i] = min + 1;++vh[dis[i]];if (i != s) {//退栈过程i = edge[pre[i]^1].v;aug = his[i];}}return flow;}
} net;int n, b, g[1002][22], s[22];void init(int x, int y) {net.Init();net.s = 0, net.t = n+b+1, net.n = n+b+2;for (int i=1; i<=n; i++) net.AddEdge(0, i, 1);for (int i=1; i<=n; i++) for (int j=x; j<=y; j++)net.AddEdge(i, g[i][j]+n, 1);for (int i=1; i<=b; i++) net.AddEdge(n+i, net.t, s[i]);
}
int main() {scanf("%d%d", &n, &b);for (int i=1; i<=n; i++) for (int j=1; j<=b; j++) scanf(" %d", &g[i][j]);for (int i=1; i<=b; i++) scanf("%d", &s[i]);int ans = INF;for (int i=1; i<=b; i++) for (int j=i; j<=b; j++) {init(i, j);if (net.flow() == n) ans = min(ans, j-i+1);}printf("%d\n", ans);return 0;
}
/**最小费用最大流模板* 连续最短路法(SPFA)* O(Maxflow(G)*kV)* HIT_ACM 2012 Summer Camp* by xiaodai*/
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>#define SETZR(a) memset(a,0,sizeof(a))using namespace std;const int maxn = 10000;
const int maxm = 1000000;
const int INF = 1000000000;struct record {int v, f, c, next;
} edge[maxm];int cas, ans, cl, n, m, s, t, aug, k, p;
int dist[maxn], pre[maxn], pointer[maxn];
bool vis[maxn];
queue<int> q;void connect(int a, int b, int f, int c) {cl++;edge[cl].next = pointer[a];edge[cl].v = b;edge[cl].f = f;edge[cl].c = c;pointer[a] = cl;cl++;edge[cl].next = pointer[b];edge[cl].v = a;edge[cl].f = 0;edge[cl].c = -c;pointer[b] = cl;
}bool spfa() {memset(vis, 0, sizeof (vis));for (int i = 0; i < n; i++) dist[i] = INF;q.push(s);dist[s] = 0;pre[s] = 0;while (!q.empty()) {k = q.front();q.pop();vis[k] = 0;for (p=pointer[k]; p; p=edge[p].next)if ((edge[p].f > 0) && (edge[p].c + dist[k] < dist[edge[p].v])) {dist[edge[p].v] = edge[p].c + dist[k];pre[edge[p].v] = p;if (!vis[edge[p].v]) {q.push(edge[p].v);vis[edge[p].v] = 1;}}}if (dist[t] == INF) return false;aug = INF;for (p=re[t]; p; p=pre[edge[p^1].v])aug = min(aug, edge[p].f);for (p=pre[t]; p; p=pre[edge[p^1].v]) {edge[p].f -= aug;edge[p^1].f += aug;}ans += dist[t] * aug;return true;
}int main() {scanf("%d", &cas);while (cas--) {cl = 1;scanf("%d%d%d%d", &n, &m, &s, &t);SETZR(pointer);for (int i = 0; i < m; i++) {int p, k, f, c;scanf("%d%d%d%d", &p, &k, &f, &c);connect(p, k, f, c);}ans = 0;while (spfa())  ;printf("%d\n", ans);}return 0;
}

最大流、最小费用最大流【模板】相关推荐

  1. 最大流 最小费用最大流模板

    模板从  这里   搬运,链接博客还有很多网络流题集题解参考. 最大流模板 ( 可处理重边 ) const int maxn = 1e6 + 10; const int INF = 0x3f3f3f3 ...

  2. bzoj 1834: [ZJOI2010]network 网络扩容【最大流+最小费用最大流】

    第一问直接跑最大流即可.建图的时候按照费用流建,费用为0. 对于第二问,在第一问dinic剩下的残量网络上建图,对原图的每条边(i,j),建(i,j,inf,cij),表示可以用c的花费增广这条路.然 ...

  3. 有源汇上下界最小费用可行流 ---- P4043 [AHOI2014/JSOI2014]支线剧情(模板)

    题目链接 题目大意: 解题思路: 有源汇上下界最小费用可行流模板题目来着 先建出一个有源汇上下界可行流的图,然后注意建图的时候要把每条边的下界的费用提前加到ans里面 然后再对图跑费用流,就是补齐费用 ...

  4. Doctor NiGONiGO’s multi-core CPU(最小费用最大流模板)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=693 题意:有一个 k 核的处理器和 n 个工作,全部的工作都须要在一个核上处理一个单位的 ...

  5. 费用流:最大费用最大流和最小费用最大流(模板)

    主要是思维建边,建有向边,然后跑模板就行了 可以解决KM算法所能解决的问题(完全取代) 可以解决非完备匹配问题中的最大权匹配和最小权匹配,分别对应着最大费用最大流和最小费用最大流 模板: 最大费用最大 ...

  6. 经典网络流题目模板(P3376 + P2756 + P3381 : 最大流 + 二分图匹配 + 最小费用最大流)...

    题目来源 P3376 [模板]网络最大流 P2756 飞行员配对方案问题 P3381 [模板]最小费用最大流 最大流 最大流问题是网络流的经典类型之一,用处广泛,个人认为网络流问题最具特点的操作就是建 ...

  7. 最小费用最大流 【模板】

    如果理解了最大流连续增广路算法的思维, 理解这个算法还是很简单的. 结构体存储信息: 分别为边的起点.终点.容量.当前流量.费用.下一条边的编号. struct Edge {int from, to, ...

  8. 乌鲁木齐网络赛J题(最小费用最大流模板)

    ACM ICPC 乌鲁木齐网络赛 J. Our Journey of Dalian Ends 2017-09-09 17:24 243人阅读 评论(0) 收藏 举报  分类: 网络流(33)  版权声 ...

  9. 【最小费用可行流模板】

    可能再也用不到了吧,今天整理电脑文件看到的,作为图论选手,留个纪念, //原图: 对于pi,拆点xi,yi s->S,[m,m],0 S->xi,[0,inf],0 yi->t,[0 ...

最新文章

  1. Anaconda,pytorch如何安装中文版的BERT和使用
  2. Jsp用于交换数据的4个map结构
  3. LinkedIn 详细介绍了他们开源的 Kafka Monitor
  4. 在线进行 PCoA 分析和相关统计检验
  5. 【今日CS 视觉论文速览】8 Jan 2019
  6. python扫地机器人开发学校_扫地机器人源码及解释
  7. 滚动页面一定距离后固定导航条
  8. 【论文笔记】Beyond Low-frequency Information in Graph Convolutional Networks
  9. mysql 实现row_number_MySQL实现ROW_NUMBER()
  10. matlab调用refprop完全说明,Matlab调用REFPROP完全说明 - 源码下载|Windows编程|其他小程序|源代码 - 源码中国...
  11. matlab电场线公式,matlab画电场线
  12. 农产品线上销售(果蔬)管理系统
  13. Python 商务统计学 lesson 01
  14. 交换机与交换机之间连接用五类线还是六类线?
  15. 华为C语言的编程规范
  16. 今天属于李志-梵高先生
  17. 求n的阶乘问题。输入一个正整数n,输出n!
  18. 严重: Null component Catalina:type=JspMonitor,name=jsp,WebModule=//localhost
  19. go pear.php 下载,请注意!有人攻破了PEAR网站并篡改了go-pear.phar安装包
  20. 024--离职手续办理

热门文章

  1. 将自动化测试推向极限
  2. Java 数组的输入输出
  3. 为什么机器人运动学逆解最好采用双变量反正切函数atan2而不用反正/余弦函数?
  4. Render函数的使用方法
  5. python实现输入一个字符串,输出每个字符的ASCLL码形成的列表
  6. 如何使用 JavaScript 制作待办事项列表
  7. Asp.Net Core WebApi 身份验证、注册、用户管理
  8. 重启服务器命令有哪些,每一个重启命令区别又是什么?
  9. 桂林山水甲天下,阳朔山水甲桂林
  10. 检测浏览器无痕模式下是否支持localStorage