网络流
最大流
EdmondsKarp
bfs找路,途中记录前驱节点
让后从汇点遍历到起点,找到最小flow
再次遍历,更新沿途边
累加答案,继续bfs
#define mem(x,y) memset(x,y,sizeof(x))
#define SIZE 1005
const int INF=0x3f3f3f3f;
int G[SIZE][SIZE],pre[SIZE];
bool vst[SIZE];
bool bfs(int s,int t){
queue<int> que;
mem(vst,0);
mem(pre,-1);
pre[s]=s;
vst[s]=true;
que.push(s);
while (!que.empty()) {
int u=que.front();que.pop();
for(int i=s;i<=t;++i){//遍历所有点
if(G[u][i]&&!vst[i]){
pre[i]=u;
vst[i]=true;
if(i==t)return true;
que.push(i);
}
}
}
return false;
}
int EK(int s,int t){
int ans=0;
while (bfs(s,t)) {
int minflow=INF;
for(int i=t;i!=s;i=pre[i]){
minflow=min(minflow,G[pre[i]][i]);
}
for(int i=t;i!=s;i=pre[i]){
G[pre[i]][i]-=minflow;
G[i][pre[i]]+=minflow; // 一定记得反向边
}
ans+=minflow;
}
return ans;
}
dinic
多路增广+当前弧优化