基本思想博客
int edge[maxn][maxn];
int pre[maxn];//记录前驱结点
int vis[maxn];//判断是否跑过
int n,m;//结点数 边数
int s,t;//s为源点 t为汇点
int flow;//最大流
bool findpath()//bfs找增广路径
{
queue<int> q;
memset(vis,0,sizeof(vis));
memset(pre,-1,sizeof(pre));
vis[s]=1;
q.push(s);
while(!q.empty())
{
int tmp=q.front();
q.pop();
for(int i=1;i<=n;i++)
{
if(vis[i]==0&&edge[tmp][i]>0)
{
pre[i]=tmp;//记录前驱结点
vis[i]=1;
q.push(i);
if(i==t) return true;
}
}
}
return false;
}
bool change()//更新
{
if(findpath()==false) //没有增广路则直接结束
{
return false;
}
int minn=edge[pre[t]][t];//最小残差路的流(上一增广路的流)
for(int i=t;i!=s;i=pre[i])
{
minn=min(edge[pre[i]][i],minn);//找到最小残差路中最小流
}
for(int i=t;i!=s;i=pre[i])//更新残图
{
edge[pre[i]][i]-=minn;
edge[i][pre[i]]+=minn;
}
flow+=minn;
return true;
}
int main()
{
//构图...
while(change());
printf("%d\n",flow);
return 0;
}