网络流模板

就是个板子

最大流Dinic

bool bfs(int s,int en)
{
    queue<int> q;
    memset(deep,0,sizeof(deep));
    q.push(s);
    deep[s]=1;
    do{
        int u=q.front();
        q.pop();
        for(int i=head[u];i!=-1;i=e[i].next)
        {
            if(e[i].flow>0 && deep[e[i].to]==0)
            {
                q.push(e[i].to);
                deep[e[i].to]=deep[u]+1;
            }
        }
    }while(!q.empty());
    if(deep[en]==0)
        return false;
    else return true;
}
int dfs(int x,int dist,int y)
{
    if(x==y)
        return dist;
    for(int i=head[x];i!=-1;i=e[i].next)
    {
        if(deep[e[i].to]==deep[x]+1 && e[i].flow!=0)
        {
           int di=dfs(e[i].to,min(dist,e[i].flow),y);
           if(di>0)
           {
               e[i].flow-=di;
               e[i^1].flow+=di;
               return di;
           }
        }
    }
    return 0;
}
int dinic(int s,int e)
{
    int ans=0;
    while(bfs(s,e))
    {
        while(int k=dfs(s,inf,e))
            ans+=k;
    }
    return ans;
}

 最小费用最大流

bool spfa(int x,int y)
{
    memset(vis,0,sizeof(vis));
    for(int i=0;i<=n+1;i++)
        dis[i]=inf;
    dis[x]=0;
    q.push(x);
    vis[x]=1;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int i=head[u];i!=-1;i=e[i].next)
        {
            if(dis[u]+e[i].cost<dis[e[i].to] && e[i].flow>0)
            {
                dis[e[i].to]=dis[u]+e[i].cost;
                pe[e[i].to]=i;
                pv[e[i].to]=u;
                if(!vis[e[i].to])
                {
                    q.push(e[i].to);
                    vis[e[i].to]=1;
                }
            }
        }
    }
    return dis[y]<inf;
}
void max_flow(int x,int y)
{
    int kflow;
    while(spfa(x,y))
    {
        printf("%d %d\n",ansf,ansc);
        kflow=inf;
        for(int i=y;i!=x;i=pv[i])
        {
            kflow=min(kflow,e[pe[i]].flow);
        }
        ansf+=kflow;
        ansc+=kflow*dis[y];
        for(int i=y;i!=x;i=pv[i])
        {
            e[pe[i]].flow-=kflow;
            e[pe[i]^1].flow+=kflow;
        }
    }
}

 

posted @ 2018-04-05 20:02  logeadd  阅读(164)  评论(0编辑  收藏  举报