SAP算法及其优化
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
const int MAXN = 1e2+10;
const int MAXM = 1e5+10;
struct node{
int c,next,to;
}edge[MAXM];
int head[MAXN];
int numh[MAXN],h[MAXN],curedges[MAXN],pre[MAXN];
int sapMaxFlow(int start,int end,int N){
int curFlow,flowAns = 0,u,tmp,neck,i;
memset(h,0,sizeof(h));
memset(numh,0,sizeof(numh));
memset(pre,-1,sizeof(pre));
for(i = 1; i <= N; ++i){
curedges[i] = head[i];
}
numh[0] = N;
u = start;
while(h[start] < N){
if(u == end){
curFlow = INF;
for(i = start; i!=end; i = edge[curedges[i]].to){
if(curFlow > edge[curedges[i]].c){
neck = i;
curFlow = edge[curedges[i]].c;
}
}
for(i = start; i!=end; i = edge[curedges[i]].to){
tmp = curedges[i];
edge[tmp].c -= curFlow;
edge[tmp^1].c += curFlow;
}
flowAns += curFlow;
u = neck;
}
for(i = curedges[u]; ~i; i = edge[i].next){
if(edge[i].c&&h[u]==h[edge[i].to]+1)
break;
}
if(i!=-1){
curedges[u] = i;
pre[edge[i].to] = u;
u = edge[i].to;
}
else{
if(0==--numh[h[u]]) break;
curedges[u] = head[u];
for(tmp = N,i=head[u];~i;i=edge[i].next)
if(edge[i].to)
tmp = min(tmp,h[edge[i].to]);
h[u] = tmp+1;
++numh[h[u]];
if(u!=start) u = pre[u];
}
}
return flowAns;
}
int main(){
return 0;
}