dinic最大流 + 弧优化 模版

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cys460714380/article/details/82535094
Dinic最大流+弧优化
int head[maxn];
struct node
{
    int u,v,cap,nt;
    node() {}
    node(int u,int v,int cap,int nt):u(u),v(v),cap(cap),nt(nt) {}
} edge[maxm];
int cnt;
void addedge(int u,int v,int cap)
{
    edge[cnt] = node(u,v,cap,head[u]);head[u] = cnt++;
    edge[cnt] = node(v,u,0,head[v]);head[v] = cnt++;
}
int dis[maxn];int cur[maxn];
bool bfs(int s,int t)
{
    mst(dis,-1);
    queue<int>q;
    dis[s] = 0;
    q.push(s);
    while(!q.empty())
    {
        int u = q.front();
        q.pop();
        for(int i=head[u]; ~i; i=edge[i].nt)
        {
            node no = edge[i];
            int v = no.v;
            int cap = no.cap;
            if(cap>0&&dis[v]==-1)
            {
                dis[v]=dis[u]+1;
                q.push(v);
            }
        }
    }
    return dis[t]!=-1;
}
int dfs(int u,int mx,int t)
{
    if(u==t)return mx;
    int used = 0;
    for(int i = cur[u]; ~i; i = edge[i].nt)
    {
        cur[u] = i;
        node &no = edge[i];
        int v = no.v;
        int cap = no.cap;
        if(dis[v]==dis[u]+1&&cap>0)
        {
            int w = mx - used;
            int flow = dfs(v,min(w,cap),t);
            edge[i].cap-=flow;
            edge[i^1].cap+=flow;
            used+=flow;
            if(used==mx)return used;
        }
    }
    if(!used)dis[u] = -1;
    return used;
}
int dinic(int s,int t,int tot)
{
    int ans = 0;
    while(bfs(s,t))
    {
        int flow;
        r0(i,tot)cur[i] = head[i];
        while(flow = dfs(s,inf,t))
            ans += flow;
    }
    return ans;
}

猜你喜欢

转载自blog.csdn.net/cys460714380/article/details/82535094
今日推荐