Dinic 与 SAP(ISAP?) 模板

发一个最大流模板

DinicDinic

//vis为int类型
//sz为总点数
namespace Dinic {
	inline bool bfs() {
	    int head = 0, tail = 0;
	    vis[S] = ++cur; q[tail++] = S; dis[S] = 0;
	    while(head < tail) {
	        int u = q[head++];
	        for(int i = fir[u]; ~i; i = e[i].nxt)
	            if(e[i].c && vis[e[i].to] != cur)
	                vis[e[i].to] = cur, dis[e[i].to] = dis[u] + 1, q[tail++] = e[i].to;
	    }
	    if(vis[T] == cur) memcpy(info, fir, (sz+1)<<2);
	    return vis[T] == cur;
	}
	int dfs(int u, int Max) {
	    if(u == T || !Max) return Max;
	    int flow=0, delta;
	    for(int &i = info[u]; ~i; i = e[i].nxt)
	        if(e[i].c && dis[e[i].to] == dis[u] + 1 && (delta=dfs(e[i].to, min(e[i].c, Max-flow)))) {
	            e[i].c -= delta, e[i^1].c += delta, flow += delta;
	            if(flow == Max) return flow;
	        }
		if(!flow) dis[u] = -1;
	    return flow;
	}
	inline int dinic() {
	    int flow=0, x;
	    while(bfs()) while((x=dfs(S, inf))) flow+=x;
	    return flow;
	}
}

SAP(ISAP?) 1.0SAP(ISAP?) 1.0

//sz为总点数
namespace SAP {
	int d[MAXN], vd[MAXN];
	int Aug(int u, int Max) {
		if(u == T) return Max;
		int delta, dmin = sz - 1, flow = 0, v;
		for(int i = fir[u]; ~i; i = e[i].nxt) if(e[i].c) {
			v = e[i].to;
			if(d[v] + 1 == d[u]) {
				delta = Aug(v, min(Max-flow, e[i].c));
				e[i].c -= delta, e[i^1].c += delta, flow += delta;
				if(d[S] >= sz || flow == Max) return flow;
			}
			if(dmin > d[v]) dmin = d[v];
		}
		if(!flow) {
			if(!(--vd[d[u]])) d[S] = sz;
			++vd[d[u] = dmin + 1];
		}
		return flow;
	}
	int sap() {
		int ans = 0;
		while(d[S] < sz)
			ans += Aug(S, inf);
		return ans;
	}
}

SAP(ISAP?) 2.0SAP(ISAP?) 2.0

//sz为总点数
namespace SAP {
	int h[MAXN], gap[MAXN];
	int Aug(int u, int Max) {
		if(u == T) return Max;
		int delta, flow = 0, v;
		for(int i = info[u]; ~i; i = e[i].nxt)
			if(e[i].c && h[v=e[i].to] + 1 == h[u]) {
				delta = Aug(v, min(Max-flow, e[i].c));
				e[i].c -= delta, e[i^1].c += delta; info[u] = i;
				if((flow+=delta) == Max || h[S] == sz) return flow;
			}
		if(!(--gap[h[u]])) h[S] = sz;
		++gap[++h[u]]; info[u] = fir[u];
		return flow;
	}
	int sap() {
		memset(h, 0, sizeof h);
		memset(gap, 0, sizeof gap);
		memcpy(info, fir, sizeof fir);
		int flow = 0;
		while(h[S] < sz)
			flow += Aug(S, inf);
		return flow;
	}
}
原文地址:https://www.cnblogs.com/Orz-IE/p/12039404.html