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;
}