网络流模板

Posted The Azure Arbitrator

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络流模板相关的知识,希望对你有一定的参考价值。

ISAP

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1e5+11;
const int oo = 0x7fffffff;
int to[maxn<<1],nxt[maxn<<1],cap[maxn<<1],flow[maxn<<1];
int head[maxn],tot;
void init(){
    memset(head,-1,sizeof head);
    tot=0;
}
void add(int u,int v,int w){
    to[tot]=v;
    nxt[tot]=head[u];
    cap[tot]=w;
    flow[tot]=0;
    head[u]=tot++;
    swap(u,v);
    to[tot]=v;
    nxt[tot]=head[u];
    cap[tot]=w;
    flow[tot]=0;
    head[u]=tot++;
}
int n,m,s,t;
int gap[maxn],dep[maxn],que[maxn];
int cur[maxn],stk[maxn];
void bfs(){
    memset(dep,-1,sizeof dep);
    memset(gap,0,sizeof gap);
    gap[0]=1;
    int front=0,rear=0;
    que[rear++]=t;dep[t]=0;
    while(front^rear){
        int u = que[front++];
        for(int i = head[u]; ~i; i = nxt[i]){
            int v=to[i];
            if(~dep[v])continue;
            que[rear++]=v;
            dep[v]=dep[u]+1;
            gap[dep[v]]++;
        }
    }   
}
int isap(){
    bfs();
    memcpy(cur,head,sizeof head);
    int ans=0,top=0,u=s;
    while(dep[s]<n){
        if(u==t){
            int mn=oo;
            int inser;
            for(int i = 0; i < top; i++){
                if(mn>cap[stk[i]]-flow[stk[i]]){
                    mn=cap[stk[i]]-flow[stk[i]];
                    inser=i;
                }
            }
            for(int i = 0; i < top; i++){
                flow[stk[i]]+=mn;
                flow[stk[i]^1]-=mn;
            }
            ans+=mn;
            top=inser;
            u=to[stk[top]^1];
            continue;
        }
        bool flag=0;
        int v;
        for(int i = cur[u]; ~i; i = nxt[i]){
            v=to[i];
            if(cap[i]-flow[i]&&dep[v]+1==dep[u]){
                flag=1;
                cur[u]=i;
                break;
            }
        }
        if(flag){
            stk[top++]=cur[u];
            u=v;
            continue;
        }
        int mn=n;
        for(int i = head[u]; ~i; i = nxt[i]){
            if(cap[i]-flow[i]&&dep[to[i]]<mn){
                mn=dep[to[i]];
                cur[u]=i;
            }
        }
        gap[dep[u]]--;
        if(!gap[dep[u]])return ans;
        dep[u]=mn+1;
        gap[dep[u]]++;
        if(u!=s)u=to[stk[--top]^1];
    }
    return ans;
}

以上是关于网络流模板的主要内容,如果未能解决你的问题,请参考以下文章

模板网络最大流

P3376 模板网络最大流——————Q - Marriage Match IV(最短路&最大流)

网络流最大流入门(Dinic算法)模板

[洛谷P3376]模板网络最大流

二分图匹配(模板)

[洛谷P3381]模板最小费用最大流