首先是几份模版
最大流:虽然EK很慢但是优势就是短。求最小割的时候可以根据增广时的a数组来判断哪些边是割边。然而SAP的最大流版我只会套版,并不知道该如何找到这个割边。在尝试的时候发现了一些问题。所以暂且搁下。这个问题目前先就EK把
struct Edge { int u,v,next; LL cap,flow; }edge[MAXM]; int head[MAXN],tot; void add_edge(int u,int v,LL cap) { edge[tot].u = u; edge[tot].v = v; edge[tot].cap = cap; edge[tot].next = head[u]; edge[tot].flow = 0; head[u] = tot++; edge[tot].u = v; edge[tot].v = u; edge[tot].cap = 0; edge[tot].flow = 0; edge[tot].next = head[v]; head[v] = tot++; } void init() { memset(head,-1,sizeof(head)); tot = 0 ; } queue<int>q; LL a[MAXN]; LL Edmonds_karp(int source,int target) { while (!q.empty()) q.pop(); int p[MAXN]; LL F = 0; while (true) { memset(p,-1,sizeof(p)); q.push(source); memset(a,0,sizeof(a)); a[source] = INF; while (!q.empty()) { int u = q.front(); q.pop(); for (int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].v; if (!a[v] && edge[i].cap > edge[i].flow) { a[v] = min(a[u],edge[i].cap - edge[i].flow); p[v] = i; q.push(v); } } } if (a[target] == 0) break; for (int i = p[target]; i != -1; i = p[edge[i].u]) { edge[i].flow += a[target]; edge[i ^ 1].flow -= a[target]; } F += a[target]; } return F; }