Dinic
说明
使用方法
Dinic d;
d.init(start,end);
初始化
d.adde(x,y,c);
加边
cout<<d.dinic<<endl
输出最大流的值
Tips
- 较EdmondsKarp快一点,但是最好用ISAP
- adde是加一条有向边,体现在参量网络上是加了正向反向两条边,如果原图中是无向的,应该执行两次加边过程
示例
模版
#define vmax 20005
#define emax 500005
struct Dinic{
int src,target,ecnt;
int head[vmax];
int cur[vmax];
int dis[vmax];
struct edge{
int to,next,cap;
}e[2*emax];
void init(int start,int end){
ecnt=0;
src=start;
target=end;
memset(head,-1,sizeof(head));
}
void adde(int from,int to,int cap){
e[ecnt].to=to;
e[ecnt].cap=cap;
e[ecnt].next=head[from];
head[from]=ecnt++;
e[ecnt].to=from;
e[ecnt].cap=0;
e[ecnt].next=head[to];
head[to]=ecnt++;
}
bool BFS(){
memset(dis, -1, sizeof(dis));
dis[src]=0;
queue<int>q;
q.push(src);
while(!q.empty()){
int tmp=q.front();
q.pop();
for(int i=head[tmp];i!=-1;i=e[i].next){
int tp=e[i].to;
if(dis[tp]==-1&&e[i].cap){
dis[tp]=dis[tmp]+1;
q.push(tp);
if(tp==target)
return true;
}
}
}
return false;
}
int DFS(int u,int delta){
if(u==target||delta==0)
return delta;
int f,flow=0;
for(int& i=cur[u];i!=-1;i=e[i].next){
if(dis[u]+1==dis[e[i].to] && (f=DFS(e[i].to,min(delta,e[i].cap))))
{
e[i].cap-=f;
e[i^1].cap+=f;
flow+=f;
delta-=f;
if(!delta)break;
}
}
return flow;
}
int dinic(){
int tmp=0,maxflow=0;
while(BFS()){
for(int i=src;i<=target;i++) cur[i]=head[i];
while(tmp=DFS(src, INF))
maxflow+=tmp;
}
return maxflow;
}
};