该算法的主要思想就是每次bfs判断是否可以到达目的地,并把多条路径记录下来,然后通过dfs进行多次增广,这样和ff算法相比时间复杂度会降低很多了。直到找不到增广路径就停止。
具体代码:
#include <iostream> #include <cstring> #include <string> using namespace std; int h[N],to[N],ne[N],cap[N],flow[N],idx=0; int dis[N]; void add(int a,int b,int c){ ne[idx]=h[a]; cap[idx]=c; flow[idx]=0; to[idx]=b; h[a]=idx++; } int bfs(int st,int ed){ memset(vi,0,sizeof vi); memset(dis,0,sizeof dis); queue<int> q; q.push(st); dis[st]=0; while(q.size()){ int t = q.front(); q.pop(); vi[t]=1; for(int i=h[t];~i;i=ne[i]){ int v = to[i]; if(vi[v])continue; if(cap[i]>flow[i]){ dis[v]=dis[t]+1; q.push(v); } } } return vi[ed]; } int dfs(int cur,int ed,int f){ if(cur==ed||f==0)return f; int ff=0; for(int i=h[cur];~i;i=ne[i]){ int v = to[i]; if(dis[v]!=dis[cur]+1)continue; int d = dfs(v,ed,min((cap[i]-flow[i]),f)); if(d){ flow[i]+=d; flow[i^1]-=d; f-=d; ff+=d; if(d==0)return d; } } return ff; } int mcmf(int st,int ed){ int res=0; while(bfs(st,ed)){ int d = dfs(st,ed,0x3f3f3f3f); res+=d; } return d; }