最大流dinic演算法
阿新 • • 發佈:2020-07-20
該演算法的主要思想就是每次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; }