#include<bits/stdc++.h>
using namespace std;
const int maxn = 10000;
#define ll long long
#define mod 10001
#define INF 1<<29
int s,t,level[maxn],head[maxn],cnt=0;
int n,m;
struct Node{
int to,next,val;
}edge[maxn*2];
void init(){
memset(level,-1,sizeof(level));
memset(head,-1,sizeof(head));
memset(edge,0,sizeof(edge));
cnt=0;
}
void addedge(int from, int to, int val){
edge[cnt].to = to;
edge[cnt].next = head[from];
edge[cnt].val = val;
head[from] = cnt++;
edge[cnt].to = from;
edge[cnt].next = head[to];//反向边
edge[cnt].val = 0;
head[to] = cnt++;
}
bool bfs(){
int front=1,end=0,q[maxn];
q[++end]=s;//初始时把源点入队
memset(level,-1,sizeof(level));
level[s] = 0;
while(front<=end){
int k = q[front];
front++;
for(int i=head[k];i!=-1;i=edge[i].next){//遍历所有点
int to = edge[i].to;
if(level[to] == -1 && edge[i].val){//如果改点没有被分层并且k点与该点有边相连 则可以进行分层
level[to] = level[k]+1;
q[++end]=to;//将该点入队
}
}
if(k == t)return true; //汇点在该分层中说明有增光 则可以进行dfs重新找路径
}
return 0;//bfs分层后都没有到汇点 则已经没有增广路
}
ll dfs(int now,int maxf){
if(now==t||maxf==0) return maxf;
int ret=0;
for(int k=head[now];k!=-1;k=edge[k].next){
int u=edge[k].to;
if(level[u]==level[now]+1&&edge[k].val){
int f=dfs(u,min(edge[k].val,maxf-ret));
edge[k].val-=f;
edge[k^1].val+=f;
ret+=f;
if(ret==maxf) return ret;
}
}
if(ret==0) level[now]=0;
return ret;
}
int main(){
init();
//构建网流量的图模型 s源 t 汇
int res = 0;
while(bfs()){
res += dfs(s,INF);
}
}
最大流板子
最新推荐文章于 2020-05-24 11:41:40 发布