#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
const int MAXN = 210;
const int MAXM = 210*210;
const int INF = 0x3f3f3f3f;
struct Edge
{
int v, next;
int f;
}edge[MAXM];
int cnt;
int n, m;
int first[MAXN];
int q[MAXN];
int gap[MAXN], h[MAXN], cur[MAXN], pre[MAXN];
//gap:优化统计高度数量数组,h: 距离标号数组;cur:当前弧数组;pre:前驱数组
void init()
{
cnt = 0;
memset(first, -1, sizeof(first));
memset(gap, 0, sizeof(gap));
memset(h, 0, sizeof(h));
memset(pre, -1, sizeof(pre));
}
void init_flow()
{
for(int i = 0; i < cnt; i += 2) //初始网络流
{
edge[i].f += edge[i^1].f;
edge[i^1].f = 0;
}
}
void read_graph(int u, int v, int f)
{
edge[cnt].v = v, edge[cnt].f = f;
edge[cnt].next = first[u], first[u] = cnt++;
edge[cnt].v = u, edge[cnt].f = 0; //反向弧流量为0
edge[cnt].next = first[v], first[v] = cnt++;
}
int Sap(int s, int t, int n)
{
int cur_flow, flow_ans = 0;
int neck, u = s;
memcpy(cur, first, sizeof(first));
gap[0] = n;
while(h[s] < n)
{
if(u == t)
{
cur_flow = INF;
for(int i = s; i != t; i = edge[cur[i]].v)
{
int f = edge[cur[i]].f;
if(cur_flow > f)
{
neck = i;
cur_flow = f;
}
}
for(int i = s; i != t; i = edge[cur[i]].v)
{
int e = cur[i];
edge[e].f -= cur_flow;
edge[e^1].f += cur_flow;
}
flow_ans += cur_flow;
u = neck;
}
int e;
for(e = cur[u]; e != -1; e = edge[e].next)
{
int v = edge[e].v, f = edge[e].f;
if(h[u] == h[v] + 1 && f) break;
}
if(e != -1)
{
int v = edge[e].v;
cur[u] = e;
pre[v] = u;
u = v;
}
else
{
int temp = n;
if(--gap[h[u]] == 0) break;
cur[u] = first[u];
for(int e = first[u]; e != -1; e = edge[e].next)
{
int v = edge[e].v, f = edge[e].f;
if(f) temp = min(temp, h[v]);
}
h[u] = temp + 1;
++gap[h[u]];
if(u != s) u = pre[u];
}
}
return flow_ans;
}
Sap算法模板
最新推荐文章于 2020-02-07 05:33:37 发布