网络流学习:最大流Dinic算法总结

来源:互联网 发布:功夫熊猫知乎 编辑:程序博客网 时间:2024/05/16 08:16

Dinic算法即连续最短增广路算法.
思路很清晰,代码很简单.
每次用BFS建立层次网络,如果汇点不在层次网络中,则退出算法;
得到层次网络后,利用DFS进行增广.

while(BFS())     ans+=DFS(1,inf);

BFS的过程中用level数组存各点的层次,相当于将层次网络储存了.

bool BFS(){    queue<int> q;    memset(level,0,sizeof(level));    level[1]=1;    q.push(1);    while(!q.empty())    {        int v=q.front();        q.pop();        for(int i=1;i<=N;i++)        {            if(!level[i]&&Map[v][i])            {                level[i]=level[v]+1;                q.push(i);            }        }    }    if(!level[N]) return false;    else  return true;}

DFS的过程就是搜索增广路并且回退进行增广的过程.

int DFS(int v,int sum){    if(v==N) return sum;    int s=sum;    for(int i=1;sum&&i<=N;i++)    {        if(Map[v][i]&&level[v]+1==level[i])        {            //从点i开始搜到一条增广路,并且得到这条路上的当前容量最小的弧的容量            int t=DFS(i,min(sum,Map[v][i]));            //对搜到的增广路进行增广            Map[v][i]-=t;            Map[i][v]+=t;            sum-=t;        }    }    return s-sum;}
0 0