【CodeVS 1993】草地排水 isap模板题

开始网络流的学习,更新一下isap的模板

#include<cstdio>
#include<cstring>
#include<algorithm>
#define read(x) x=getint()
using namespace std;
const int N = 403;
int getint() {
	int k = 0, fh = 1; char c = getchar();
	for(; c < '0' || c > '9'; c = getchar())
		if (c == '-') fh = -1;
	for(; c >= '0' && c <= '9'; c = getchar())
		k = k * 10 + c - '0';
	return k * fh;
}
int cap[N], d[N], cur[N], point[N], nxt[N], gap[N], p[N], to[N], from[N], cnt = 1;
void ins(int x, int y, int z) {
	nxt[++cnt] = point[x]; to[cnt] = y; cap[cnt] = z; from[cnt] = x; point[x] = cnt;
}
int isap(int s, int t, int n) {
	int flow = 0, i, u, f = 0x7fffffff;
	memset(gap, 0, sizeof(gap)); memset(d, 0, sizeof(d));
	for(int i = 0; i <= n; ++i)
		cur[i] = point[i];
	u = s; gap[0] = n;
	while (d[s] < n) {
		for(i = cur[u]; i; i = nxt[i]) if (cap[i] && d[u] == d[to[i]] + 1) break;
		if (i) {
			cur[u] = i; p[to[i]] = i; u = to[i];
			if (u == t) {
				for(f = 0x7fffffff; u != s; u = from[p[u]]) f = min(f, cap[p[u]]);
				for(u = t; u != s; u = from[p[u]]) cap[p[u]] -= f, cap[p[u] ^ 1] += f;
				flow += f;
			}
		} else {
			if (!(--gap[d[u]])) break;
			d[u] = n;
			cur[u] = point[u];
			for(i = cur[u]; i; i = nxt[i])
				if (cap[i] && d[u] > d[to[i]] + 1)
					d[u] = d[to[i]] + 1;
			++gap[d[u]]; if (u != s) u = from[p[u]];
		}
	}
	return flow;
}
int main() {
	memset(point, 0, sizeof(point));
	int u, v, e, n, m;
	read(m); read(n);
	for(int i = 1; i <= m; ++i) {
		read(u); read(v); read(e);
		ins(u, v, e);
		ins(v, u, 0);
	}
	printf("%d\n", isap(1, n, n));
	return 0;
}

233

转载于:https://www.cnblogs.com/abclzr/p/5380039.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值