一、dinic最大流

我的模板。模板上已经有了dfs上的优化(比我以前的快多了。。)优化啊优化。

bool bfs(int st,int ed)
{
    while(!q.empty()) q.pop();
    memset(d,-1,sizeof(d));
    q.push(st);
    d[st]=0;
    while(!q.empty())
    {
        int x=q.front();q.pop();
        for(int i=first[x];i!=-1;i=a[i].next)
        {
            int y=a[i].y;
            if(d[y]==-1 && a[i].d>0)
            {
                d[y]=d[x]+1;
                q.push(y);
            }
        }    
    }
    return (d[ed]!=-1);
}

int dfs(int x,int flow,int ed)
{
    int k,p,r=0;
    if(x==ed) return flow;
    for(int i=first[x];i!=-1;i=a[i].next)
    {
        int y=a[i].y;
        if(d[y]==d[x]+1 && a[i].d>0)
        {
            p=minn(a[i].d,flow-r);
            p=dfs(y,p,ed);
            r+=p; //优化,把从这个点开始能流的全部流了
            a[i].d-=p;
            a[i^1].d+=p;
        }
                if(r==flow) break; // 优化
    }
    if(!r) d[x]=-1;  //优化
    return r;
}

int dinic(int st,int ed)
{
    int ans=0;
    while(bfs(st,ed))
    {
        int k;
        while(k=dfs(st,INF,ed)) ans+=k;
    }
    return ans;
}
dinic

相关文章: