Dinic算法学习资料

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


 


你可能感兴趣的:(算法,Path)