http://trp.jlu.edu.cn/software/net/lssx/4/4.38.htm
http://www.cnblogs.com/zen_chou/archive/0001/01/01/1525841.html
初始化,计算剩余图;
while(BFS()) //BFS过程的作用:1,计算层次图;2,当汇点不再层次图内时返回0
{
path.clear();
源点入栈path; //栈path保存层次图内从原点到终点的可行路径
while(源点的出度不为0)
{
u<-path.top;
if (u!=汇点) //在层次图内寻找一条从起点到终点的路径
{
if (u出度大于0)
将层次图内与u相连的点v入栈;
else
{
u出栈; //从path中删除
u的level=正无穷; //从层次图中删除
}
}
else //对路径增广
{
在剩余图中沿P增广;
令path.top为从起点可到达的最后一个顶点;
}
}
}
//Dinic算法模板
//Author:dd_engi
void Dinic()
{
for(;;){
BFS();
if(D[T]==-1)break;
int path_n=0;
int x=S;
memcpy(cur,E,sizeof(cur));
for(;;){
if(x==T){
int mink=-1,delta=INT_MAX;
for(int i=0;i<path_n;++i){
if(path[i]->c<delta){
delta=path[i]->c;
mink=i;
}
}
for(int i=0;i<path_n;++i){
path[i]->c-=delta;
path[i]->back->c+=delta;
}
path_n=mink;
x=path[path_n]->x;
}
edge* e;
for(e=cur[x];e;e=e->next){
if(e->c==0)
continue;
int y=e->y;
if(D[x]+1==D[y])
break;
}
cur[x]=e;
if(e){
path[path_n++]=e;
x=e->y;
}
else{
if(path_n==0)
break;
D[x]=-1;
--path_n;
x=path[path_n]->x;
}
}
}
}